Message Control Multicast Translator 葉俊克 系統架構 Translator ZigBee Node Communication Interface(RS232) PC Server-PC ZigBee ZigBee Node RF Mapping address Ethernet 系統模組架構 MCMT Server PC ZigBee Node RS232 UART Address Mapping Table UART ZigBee ZigBee Node socket UDP Protocol Translator IPv6 <-> ZigBee IPv6 IEEE 802.3 UDP IPv6 raw socket libpcap IEEE 802.3 3 Terminal • Open terminal – int open(const char *path, int oflag, option ) • Read/Write data from terminal RX/TX – ssize_t read(int fildes, void *buf, size_t nbyte) – ssize_t write(int fildes, const void *buf, size_t nbyte) • flush non-transmitted output data, non-read input data, or both – int tcflush(int fildes, int queue_selector) Socket Setting • Open socket (raw模式、raw協定) – int socket(int domain, int type, int protocol) – socket(PF_INET6, SOCK_RAW,IPPROTO_RAW ) • Set socket(不自動建立ip header) – int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len) – setsockopt(sockfd, IPPROTO_RAW, IP_HDRINCL, &optval, sizeof(int)) Socket • Send data with a dst addr – ssize_t sendto(int socket, const void *message, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len) • Receive data – ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags, struct sockaddr *restrict address, socklen_t *restrict address_len • Udp check sum – unsigned int Checksum(unsigned int cksum, void *pBuffer, unsigned int size) Pcap • Find all NIC – int pcap_findalldevs(pcap_if_t **alldevsp, char *ebuf) • Open a NIC to capture packet – int pcap_open_live(char *dev, int snaplen, int promisc, int ms, char *ebuf) • Check the NIC can be used – int pcap_datalink(pcap_t *p) Pcap • Compile the Filter Expressions – int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask) • Associate a Filter to a Capture – int pcap_setfilter(pcap_t *p, struct bpf_program *fp) • Capture Packets – int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) thread • int pthread_create(pthread_t *pthread, pthread_attr_t *attr, void *(*start_routine) (void *), void *asg); – 簡單說明 Tech. Doc. • Socket – Sock raw – Udp checksum • Pcap – Winpcap • UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking API • Linux程式設計教學手冊(Beginning Linux Programming) • 線上linux api查詢工具 • http://www.digipedia.pl/man/ • http://swoolley.org/man.cgi • Libpcap Install and Compile – Install Libpcap LibPCAP-Devel • yum install libpcap libpcap-devel – Compile • gcc expcap.c –l pcap • Pthread – Compile • gcc exthread.c –lpthread • Gcc –D_REENTRANT –I/usr/include/nptl ex.c – L/usr/lin/nptl –lpthread (舊版方式,2003年以前。在 /usr/inlcude/phtrad.h檔可看日期) API-ZigBee-Setting • Set channel and PANID at tool/8wConfig.cfg – -DDEFAULT_CHANLIST=0x00001000 // 12 - 0x0C – -DZDAPP_CONFIG_PAN_ID=0xABCD • Set Multicast/Groupcast at nwk_globals.c – _NIB.nwkUseMultiCast = TRUE // Multicast – _NIB.nwkUseMultiCast = FALSE // Groupcast API-ZigBee-UART • Set UART parameter at hal_uart.c – uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config) • UART read/write – uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len) – uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len) API-ZigBee-Group • Add group for an endpoint at aps_group.h – ZStatus_t aps_AddGroup( uint8 endpoint, aps_Group_t *group ) • Find a group with endpoint and groupID – aps_Group_t *aps_FindGroup( uint8 endpoint, uint16 groupID ) • Remove a group with endpoint and groupID – uint8 aps_RemoveGroup( uint8 endpoint, uint16 groupID ); API-ZigBee • Send RF Data at AF.h – AF_DataRequest( afAddrType_t *dstAddr, endPointDesc_t *srcEP, uint16 cID, uint16 len, uint8 *buf, uint8 *transID, uint8 options, uint8 radius ) • Data message processor callback – void SampleApp_MessageMSGCB( afIncomingMSGPac ket_t *pkt ) ZigBee Tech. doc. • In Z-Stack Documents – Z-Stack User's Guide - CC2530DB(read it first) – Z-Stack Developer's Guide (read it before programming) – Z-Stack Sample Applications (description of sample) – Z-Stack API – HAL Driver API (UART,LCD,LED,Switch) ZigBee Tools • Z-Stack - ZigBee Protocol Stack – last: ZStack-CC2530-2.4.0-1.4.0(swrc126d.zip) • SmartRF Protocol Packet Sniffer – last: Packet Sniffer 2.15.1 (Rev. S) • SmartRF Flash Programmer – last: Flash Programmer 1.11.1 (Rev. M) • IAR Embedded Workbench® for 8051 – Version: 7.60 – Last: 8.10 IAR Open Workspace • “File”->”Open”->”Workspace” • C:\Texas Instruments\ZStack-CC2530-2.4.01.4.0\Projects\zstack\Samples\SampleApp\CC2530DB IAR Build Setting • For generating a .hex file IAR Build Setting • “Project”->”Options…” IAR Build Setting Generating a .hex File • Make: link to a .hex file • Rebuild All: build a new .hex file Download a File to Device • C:\Texas Instruments\ZStack-CC2530-2.4.0-1.4.0\Projects\zstack\ Samples\SampleApp\CC2530DB\CoordinatorEB\Exe\CoordinatorEB.hex Demo • Translators-PC: 2001:0e10:6840:21:21e:90ff:fe18:4cc // 10.21.10.103 • Translators-RF: MAC: 00124B00010A2A83 • Node A: MAC: 00124B00010A2A75 • Node B: MAC: 00124B00010A2A5C • Server: 0x00a1 2001:e10:6840:21:4687:fcff:fe41:6c0b // 10.10.21.59 • Prefix: 2001:e10:6840:409 • 設定路由表 – route –A inet6 add ZigBee_Prefix gw Translator_IP [dev ethx] • 增加IP – ip -6 addr add ip dev ethx • 啟動MCMT – ./MCMT • 啟動server – ./Recv • 啟動ZigBee Device • 按五向鍵的”下” – 發送加入maping table的封包 – 00 saddr MAC Join Translator Node A Send data: 00(MT) + aa aa (short address) + 00 12 4b 00 01 0a 2a 75(MAC) Node B Send data: 00(MT) + bb bb (short address) + 00 12 4b 00 01 0a 2a 5c(MAC) Translator Communication Interface(RS232) PC ZigBee Address Mapping Table Src + Dst + Data aa aa + 00 00 + 00(MT) + aa aa + 00 12 4b 00 01 0a 2a 5c bb bb + 00 00 + 00(MT) + bb bb + 00 12 4b 00 01 0a 2a 5c 00 00(因為不需轉發,所以此欄在此功能不重要,但為了一致性仍保留) Send data to server Translator Node A Node B Communication Interface(RS232) ZigBee PC Server-PC Q&A • 目前無法將End device的rxonwhenidle==ture 啟用。