查看: 704|回复: 0

【英蓓特I.MX8M MaaXBoard开发板】试用-Zigbee网关

[复制链接]
  • TA的每日心情
    开心
    2020-11-27 08:26
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2020-11-3 19:51:46 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 断点0216 于 2020-11-3 19:56 编辑

      上一篇在MaaXBoard安装了qtcreator,并通过qt实现了仪表和曲线图控件,但显示的数据是程序模拟的,并非真实的外部数据。今天抽空来让MaaXBoardZigbee碰撞一下。本篇MaaXBoard将作为物联网网关,与Zigbee网络的协调器通过串口连接。Zigbee协调器负责创建和维护网络,是网络中的唯一节点,Zigbee终端负责加入网络,将采集到的传感器数据无线传输给协调器。协调器通过串口传给MaaXBoard

      接线方式如下:

    图片1.png

      协调器1
      终端3

      数据传输方式采用广播的方式。


      数据发送部分代码:

    1. void SampleApp_SendPeriodicMessage( void )
    2. {
    3.   byte SendData[18]="end1,hello world!";
    4.   if( AF_DataRequest( &SampleApp_Periodic_DstAddr,
    5.                        &SampleApp_epDesc,
    6.                        SAMPLEAPP_PERIODIC_CLUSTERID,
    7.                        17,
    8.                        SendData,
    9.                        &SampleApp_TransID,
    10.                        AF_DISCV_ROUTE,
    11.                        AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
    12.   {
    13.   }
    14.   else
    15.   {
    16.     HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
    17.     // Error occurred in request to send.
    18.   }
    19. }
    复制代码


      数据接收处理代码

    1. void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
    2. {
    3.   uint16 flashTime;
    4.   byte buf[18];
    5.   byte tmpbuf[10];

    6.   switch ( pkt->clusterId )
    7.   {
    8.     case SAMPLEAPP_PERIODIC_CLUSTERID: //收到广播数据
    9.       osal_memset(buf, 0 , 18);
    10.       osal_memcpy(buf, pkt->cmd.Data, 17); //复制数据到缓冲区中
    11.       
    12.       if(buf[0]=='e' && buf[1]=='n' && buf[2]=='d')
    13.       {
    14.           HalLedBlink(HAL_LED_1, 0, 50, 500);//如果是则Led1间隔500ms闪烁
    15. #if defined(ZDO_COORDINATOR)
    16.           SampleApp_SendPeriodicMessage();
    17.           HalUARTWrite(0,"Receive data from ", strlen("Receive data from "));//串口发送
    18.           HalUARTWrite(0,buf, 4);
    19.           HalUARTWrite(0,"\n", 1);
    20. #endif
    21.       }
    22.       else
    23.       {
    24.           HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);                  
    25.       }
    26.       break;

    27.     case SAMPLEAPP_FLASH_CLUSTERID: //收到组播数据
    28.       flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );
    29.       HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );
    30.       break;
    31.   }
    32. }
    复制代码



      接下来是MaaXBoard串口的读取,这里有段小插曲,之前没有留意到板卡的40pin还有个串口2,我一直用的USBTTL的串口转换板。接入后执行lsusb命令,已经能看到CH340的设备,但是在/dev目录下怎么也找不到设备(或者说根本区分不出哪个设备是USB串口),开发指南和说明文档上也没有关于USB转串口这部分的说明。好在仔细浏览了一遍文档,才发现有TTL串口。

    图片2.png


      串口设备找到了,那就用吧。创建一个c文件myuart.c

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <unistd.h>
    4. #include <time.h>
    5. #include <pthread.h>
    6. #include <string.h>
    7. #include <stdio.h>
    8. #include <stdlib.h>
    9. #include <unistd.h>
    10. #include <fcntl.h>
    11. #include <sys/ioctl.h>
    12. #include <termios.h>
    13. #include <sys/types.h>

    14. int Option_Set(int fd,int baudRate,int nBits,char nEvent,int nStop)
    15. {
    16.         struct termios newtio,oldtio;
    17.         if(tcgetattr(fd,&oldtio)!=0)
    18.         {               
    19.                 return -1;
    20.         }
    21.         bzero(&newtio,sizeof(newtio));
    22.         newtio.c_cflag |= CLOCAL |CREAD;
    23.         newtio.c_iflag &= ~CSIZE;
    24.         switch(nBits)
    25.         {
    26.                 case 5:
    27.                         newtio.c_cflag |= CS5;
    28.                         break;
    29.                 case 6:
    30.                         newtio.c_cflag |= CS6;
    31.                         break;
    32.                 case 7:
    33.                         newtio.c_cflag |= CS7;
    34.                         break;
    35.                 case 8:
    36.                         newtio.c_cflag |=CS8;
    37.                         break;
    38.                 default:
    39.                         newtio.c_cflag |=CS8;
    40.                         break;
    41.         }
    42.         switch(nEvent)
    43.         {
    44.                 case 'o':
    45.                         newtio.c_cflag |= PARENB;
    46.                         newtio.c_cflag |=PARODD;
    47.                         newtio.c_iflag |=(INPCK | ISTRIP);
    48.                         break;
    49.                 case 'E':
    50.                         newtio.c_iflag |=(INPCK | ISTRIP);
    51.                         newtio.c_cflag |=PARENB;
    52.                         newtio.c_cflag &= ~PARODD;
    53.                         break;
    54.                 case 'N':
    55.                         newtio.c_cflag &= ~PARENB;
    56.                         break;
    57.                 default:
    58.                         newtio.c_cflag &= ~PARENB;
    59.                         break;

    60.         }
    61.         switch(baudRate)
    62.         {  
    63.                 case 2400:
    64.                         cfsetispeed(&newtio,B2400);
    65.                         cfsetospeed(&newtio,B2400);
    66.                         break;
    67.                 case 4800:
    68.                         cfsetispeed(&newtio,B4800);
    69.                         cfsetospeed(&newtio,B4800);
    70.                         break;
    71.                 case 9600:
    72.                         cfsetispeed(&newtio,B9600);
    73.                         cfsetospeed(&newtio,B9600);
    74.                         break;
    75.                 case 57600:
    76.                         cfsetispeed(&newtio,B57600);
    77.                         cfsetospeed(&newtio,B57600);
    78.                         break;
    79.                 case 115200:
    80.                         cfsetispeed(&newtio,B115200);
    81.                         cfsetospeed(&newtio,B115200);
    82.                         break;
    83.                 case 460800:
    84.                         cfsetispeed(&newtio,B460800);
    85.                         cfsetospeed(&newtio,B460800);
    86.                         break;
    87.                 default:
    88.                         cfsetispeed(&newtio,B9600);
    89.                         cfsetospeed(&newtio,B9600);
    90.                         break;
    91.         }
    92.         if(nStop == 1)
    93.         {
    94.                 newtio.c_cflag &= ~CSTOPB;
    95.         }
    96.         else if(nStop == 2)
    97.         {
    98.                 newtio.c_cflag |= CSTOPB;
    99.         }
    100.         newtio.c_cc[VTIME] = 0;
    101.         newtio.c_cc[VMIN] = 1;
    102.         tcflush(fd,TCIFLUSH);
    103.         if((tcsetattr(fd,TCSANOW,&newtio))!=0)
    104.         {
    105.                 printf("com set error");
    106.                 return -1;
    107.         }
    108.         return 0;
    109. }


    110. int SerialInit(const char* ttyName,int baudRate,int nBits,char nEvent,int nStop)
    111. {
    112.         if (NULL == ttyName)
    113.         {
    114.                 printf("ttyName is NULL");
    115.                 return -1;
    116.         }
    117.         int nComFd = 0;
    118.         nComFd = open(ttyName, O_RDWR|O_NOCTTY);
    119.         if (nComFd <= 0 )
    120.         {
    121.                 printf("Couldn't open %s", ttyName);               
    122.                 return -2;
    123.         }
    124.         else
    125.         {
    126.                 printf("open %s success!", ttyName);        
    127.         }
    128.         Option_Set(nComFd,baudRate,nBits,nEvent,nStop);
    129.         fcntl( nComFd, F_SETFL, 0 );
    130.         return nComFd;
    131. }

    132. int SerialDestroy(int nComFd)
    133. {
    134.         if (nComFd > 0)
    135.         {
    136.                 close(nComFd);
    137.         }
    138.         return 0;
    139. }

    140. int main(void)
    141. {
    142.         int fd = 0;
    143.         fd = SerialInit("/dev/ttymxc1", 9600, 8, 'N', 1);
    144.         if (fd < 0)
    145.         {
    146.                 printf("/dev/ttymxc1 does not exist!\n");
    147.                 return 0;
    148.         }

    149.         char RcvBuf[1024] = {0};
    150.         int nRead = 0;

    151.         while (1)
    152.         {
    153.                 memset(RcvBuf, 0, 1024);
    154.                 nRead = read(fd, RcvBuf, 1024);
    155.                 if (nRead > 0)
    156.                 {
    157.                         //printf("recv %d data: %s", nRead, RcvBuf);
    158.                         printf(RcvBuf);
    159.                 }
    160.                 sleep(0.1);
    161.         }
    162.         SerialDestroy(fd);
    163.         return 0;
    164. }
    复制代码



      编译代码
      gcc myuart.c -o main,生成可执行文件main

    图片3.png


      给zigbee模块上电,并执行main文件

      ./main


    图片4.png


      协调器会收到3zigbee终端定时发出的数据包,至此,初步的组网和数据上传网关功能完成。下一篇,通过qt编写zigbee网关程序,并将数据写入共享内存,qt窗体程序和共享内存交互,实现控件的联动。




    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 15:43 , Processed in 0.116635 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.