文件夹examples/antelope/netdb 下的程序文件netdb-client.c 是数据库应用系统的客户端程序,该客户程序提供了一个用于输入查询命令的串行接口。客户程序的shell进程处理这些串口消息(查询),并且把这些查询发送给运行在另一个传感器上的服务器程序,一旦客户程序接收到对该查询的响应,它会在shell中输出确认信息。下面分析该程序源代码。
SERVER_ID 指定要给发送查询的服务器,这里把SERVER_ID 设置为4,是因为后面用到的Cooja 仿真程序netdb.csc(examples/antelope/netdb 文件夹中给定的Cooja 仿真文件)中在标识符为4 的节点上加载了后面要介绍的服务器程序netdb-server.c。
上面源代码片段的第二行建立了结构体mesh_conn,该结构体用于存储客户和服务器之间的连接细节。Antelope 使用Rime mesh 路由协议在客户和服务器之间交互消息。下面是另一种重要的数据结构mesh_callbacks,该数据结构包含netdb_client.c程序文件中实现的回调函数。
上面源代码的前两行建立了netdb_process(数据库进程)和shell_process两个进程,shell_process 是提供输入查询的客户串行接口的进程。AUTO⁃START_PROCESSES(&netdb_process)启动netdb_process,意味着与该进程相关的线程将由调度程序启动运行,下面是该进程线程的代码片段:
netdb_process 的原线程被创建,并申明了netdb_process 的退出处理程序PROCESS_EXITHANDLER()。PROCESS_BEGIN()和PROCESS_END()是原线程申明中要求的函数。关于Contiki 原线程和进程的细节可参考第3 章的内容。mesh_open 打开新的连接,并且建立的该mesh 连接在NETDB_CHANNEL(70)上,第三个参数callbacks 包含函数指针,该指针指向当该信道上到达分组时将被调用的函数。process_start(&shell_process, NULL)启动shell 进程,该进程提供串行接口,这是从一个进程启动另一个进程,而不是使用AUTO⁃START_PROCESS启动进程的例子。
netdb_client进程mesh连接的回调处理有以下三种情况:
当尝试用函数mesh_send()发送数据并且实际传输数据时调用函数sent()。(www.xing528.com)
(2)回调函数-timedout
当尝试用函数mesh_send()发送分组并且因超时删除了该分组时调用函数timedout(),这里仅输出"Failed to send the packet:time out"。
(3)回调函数-received
当接收到分组时调用函数received(),在netdb_client 进程的函数句柄received 中,c 表示该信道的Mesh 连接,from 是服务器的地址,该服务器发送了接收到的分组,hops 是客户和服务器之间的跳数。在该函数中,验证错误条件(len>MAX_QUERY_SIZE),如果该条件为真,则输出错误信息Too long query。如果没有出错则响应查询,响应信息在串行接口输出。
下面我们看看shell_process的源代码。
该代码片段是进程shell_process的进程线程,当执行无限循环for(;;)循环时,进程停止执行等待串行事件出现,即等待“PROCESS_WAIT_EVENT_UNTIL(ev == serial_line_event_message && data != NULL)”接收的串行事件。串行事件消息定义了用户从串行接口输入的信息(数据不应该为NULL)。如果数据(用户从shell串行接口输入的数据)中有服务器标识符,从数据中复制服务器标识符,并且变量“server_id”被设置为该值,否则数据被认为是查询消息,并且addr被设置为服务器的地址,使用mesh 路由协议向该服务器发送分组时调用mesh_send()函数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。