DNA图谱 / 问答 / 问答详情

zigbee调用Zstack程序串口通信 开头出现固定乱码 怎么解决?

2023-07-06 08:24:12
共1条回复
bikbok

问题点找到了,debug_str()会将在LCD显示的数据同时也传到PC,它是通过调用MT层中的MT_ProcessDebugStr()来完成的,所以每条显示的内容都会增加一个包头,也就是你看到的乱码。

这里给你两个建议,一个屏蔽debug_str(),不增加后面的那一行,在LCD的外部是写串口通信。二是屏蔽debug_str()后,使用HalUARTWrite()函数来发送数据,就没有乱码了。我个人鄙视第二种做法。

相关推荐

基础程序添加到zstack

基础程序添加到ZStack中,可以按照以下步骤进行:1、在ZStack上创建虚拟机:首先,需要在ZStack上创建一台虚拟机,作为你的基础程序运行的环境。2、安装操作系统和相关软件:在虚拟机中,需要安装适合你基础程序的操作系统和相关的软件库、开发工具等。3、编写和上传基础程序:在虚拟机中,可以使用你熟悉的开发工具编写基础程序,并将程序上传到虚拟机中。4、添加到ZStack中:最后,可以将虚拟机打包成镜像,并将其添加到ZStack中,以便在需要的时候快速创建虚拟机并运行您的基础程序。
2023-07-06 04:16:271

zstack无线点灯实验原理

您要问的是zstack无线点灯实验原理是什么?zstack无线点灯实验原理如下:1、网络拓扑:通过ZStack协议栈,建立一个Zigbee网络,其中包括一个协调器(Coordinator)和一个或多个终端设备(EndDevice)。2、灯具控制:在终端设备中,可以连接一个或多个灯具作为可控制的目标。
2023-07-06 04:16:331

上海zstack怎么样

待遇好。上海zstack公司环境良好,发展前景好,福利待遇有五险一金,绩效奖金,年终奖等。ZStack是上海云轴信息科技有限公司旗下品牌,由阿里云、中国电信战略投资并战略合作,是一家自主创新、专注产品化的云计算公司。
2023-07-06 04:16:391

zstack解决不了什么问题

都能解决。ZStack作为自主创新的云厂商,支持信创适配,拥有知识产权储备,申报多项软著和专利,安装部署以及升级对ZStack而言,从来都是简单,快速,ZStack自定义了ISO,封装了网络配置以及ZStack服务管理的命令,哪怕是一个运维小白也能够很快安装好一个ZSack平台,不需要太长的学习周期。ZStack(云轴科技)是上海云轴信息科技有限公司旗下品牌,由阿里云、中国电信战略投资并战略合作,自主创新、专注产品化的云计算。
2023-07-06 04:16:461

zstack端口号的作用

实时监控作用。zstack端口号的核心云引擎,使用消息总线同数据库MariaDB及各服务模块进行通信,提供了云主机管理、物理主机管控、存储调度、网络功能、账号计费、实时监控等功能。
2023-07-06 04:16:531

zstack虚拟机与kvm关系

zstack虚拟机与kvm关系是虚拟启动关系。在Archlinux的KVM虚拟机上启动来部署开源Iaas系统zstack时,需要开启虚拟机嵌套虚拟化。虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
2023-07-06 04:16:591

istack和zstack一体机区别

跟iStack相比,ZStack具有易用特征。zstack一体机具有易用、稳定、灵活、超高性能等特点,istack并不灵活与稳定。
2023-07-06 04:17:071

zstack怎么停用物理机

1、首先选择一体机中的一台物理机。2、然后将该物理机输入进入维护模式。3、最后就能将zstack设备关闭了。
2023-07-06 04:17:211

Zstack值得去吗

Zstack值得,ZStack屡获投资界重量级融资。ZStack企业版的发布,通过一系列创新设计的架构,解决了围绕IaaS软件的几大难题:易用性、稳定性、可伸缩性和灵活性,一度引发业界的高度关注。正如前面所说,ZStack创始团队有着过硬的专业背景,他们是世界上最早做虚拟化和云计算的架构师,经过十年磨剑,ZStack已经是他们在这个领域的第三次创新了。经过各种实验,ZStack突破性地融合运用了全异步架构、无锁架构、进程内微服务架构、瀑布架构、全插件架构等精巧设计,成功地解决了超大型系统的稳定性和并发性难题,同时还赋予了产品极强的灵活性和可扩展性。
2023-07-06 04:17:281

ZStack可以对网络和磁盘设置QoS吗?在哪里设置呢,范围多少?

支持。创建计算规格或云盘规格的时候支持设置QoS,也可在云主机配置界面进行修改。磁盘QoS设置范围为:1MB/s~100GB/s;网卡QoS设置范围为:8Kbps-30Gbps。还有其他问题可以搜下相关问题。
2023-07-06 04:17:472

使用ZStack的话,云盘可以建立在共享存储上,且可以进行任意挂载吗?

我一直都在用ZStack,之前也在他们社区问过类似的问题,关于这个问题可以说非常有话语权了。ZStack是可以给一个区域内不同集群添加不同主存储的,主存储可以是本地存储也可以是共享存储,全看你选择哪个。? 如果主存储为共享存储的话,云盘就创建在共享存储上,云盘和物理主机无关 ,可以挂载到任意物理节点的云主机上。即:云盘的挂载不受物理主机的相关约束,而且不支持云盘迁移。? 如果主存储为本地存储,挂载一个卸载过的云盘时,需要保证该云盘和目标云主机在相同的物理主机上。如果该云盘和目标云主机不在相同的物理主机上,需要将云盘和云主机迁移到相同的物理主机上。可以选择迁移云主机(需要首先停止云主机),也可以选择迁移云盘。
2023-07-06 04:18:141

有人知道ZStack的存储是怎么计算的么?本人对这个比较感兴趣

我对ZStack研究也有小一年了,不过这种技术性问题我还是请教了大佬再来回答你。ZStack的存储分为主存储和镜像服务器。(以下讨论均不涉及超分情况)镜像服务器的计算相对简单,其总容量和真实容量对应实际的物理值(即与df-h命令结果相同)主存储分为物理总容量、物理可用容量和总容量、可用容量。其中物理总容量、物理可用容量与镜像服务器的技术方法相同,为物理真实容量。这里需要理解的主存储的总容量(TotalCapacity)和可用容量(AvailableCapacity)。总容量与实际总容量相同,可用容量为总容量减去云盘的虚拟容量(VirtualSize)。说明:例如:主存储为500G,使用一个大小为100G的镜像创建云主机,实际大小为3G。在主存储上看到的可用容量为500G-100G=400G,而它的物理真实容量为500G-3G=497G。ZStack主存储URL指定到某个分区的目录上,主存储的总容量为目录所属分区的总容量。ZStack只关心自己使用的容量(镜像、云盘、快照),其他用户在这个分区使用的空间不计入已使用的容量中。因此,可用容量=所属分区的总容量-自己使用的容量。其中,主存储上的镜像和快照为真实容量,云盘为虚拟容量。每次容量校准需要重连物理机。以上,是大佬给我的回答,不过我从他们官网搜刮来的答案基本也和上面差不多。如果还有问题的话可以联系我沟通或者直接访问ZStack官网咨询。
2023-07-06 04:18:211

有人知道ZStack的全局设置中主存储超分的计算方法是怎么运算的么?

ZStack中,允许一个集群添加两个主存储。但是如果主存储类型不同的话,比如一个LocalStorage和一个NFS。再次创建云主机,root盘将默认创建在LocalStorage,data盘将默认创建在NFS。这种情况需要注意一下哈。
2023-07-06 04:18:282

一台机器可以安装ZStack么?

可以的,ZStack最小安装只需要一台机器,可以同时作为管理节点和计算节点;生产环境建议分离部署。ZStack只需一台管理节点,就可以管控所有的硬件资源。相对来说对于设备数量的要求还是非常低的,具体安装的话他们官网描述的比较详细,可以大概看一下哈。
2023-07-06 04:18:365

ZStack与OpenStack最大的区别?

就我自己个人使用ZStack的情况来看,跟OpenStack差别还是很大的。ZStack 不是基于OpenStack进行二次开发,二次改造的,是完全国产自主研发的云计算平台软件。ZStack 架构设计更为简单,安装部署更简单,从裸机安装到云主机创建出来只需要30分钟,一键执行5分钟就可以自动升级完毕,体验ZStack的最新功能。控制面与数据面完全解耦,控制面出现问题,完全不影响数据面。
2023-07-06 04:18:521

ZStack对网络的最低要求是什么?

ZStack对网络的要求应该还算是蛮低的,但是如果在生产环境中使用,也会对网络有要求,这是我们在使用ZStack中总结出来的网络要求,大家可以看一下。用于管理资源的网络,建议千兆以上;用于运行业务的网络,建议千兆以上;用于承载存储的网络,建议万兆以上;生产环境,网络要求配置高可用,做堆叠或者Bonding。
2023-07-06 04:18:592

ZStack怎么清理管理节点监控数据来释放管理节点的系统盘空间?

云平台监控数据默认存放在管理节点的/var/lib/zstack/prometheus/data/路径,在管理节点系统盘容量不足的情况下,若已确认不需要监控数据,可以通过清理监控数据来释放部分容量,删除监控数据具体方法如下:? 3.1.0 版本之前,请执行以下命令删除监控数据:zstack-ctl stop-node && kill -9 ps -ef|grep [t]ools/prometheus|awk "{print $2}" && rm -rf /var/lib/zstack/prometheus/data/ && zstack-ctl start-node? 3.1.0 及其以后版本,请执行以下命令删除监控数据:systemctl stop prometheus && rm -rf /var/lib/zstack/prometheus/data && systemctl start prometheus我也是从官网常见问题扒的,你可以试一下,要是不行的话就请教售后吧。
2023-07-06 04:19:061

ZStack如何与其他公有云或私有云对接?

我们安装的ZStack平台之后,发现ZStack可以无缝与阿里云公有云对接,一套UI直接管理私有云和公有云的云主机。ZStack可以使用其他公有云或私有云提供的标准API接口进行对接,也可以将其他云添加至ZStack的应用中心,进行简单的统一入口管理。目前我们已经通过ZStack打通了我们的私有云与阿里云之间的连接。
2023-07-06 04:19:151

如何在Zstack 中使用串口

网上和论坛里面很多帖子都把精力集中到分析协议栈的串口工作机制上,比如分析DMA工作原理,中断工作原理,然后分析输入和输出Buffer的处理等内容,学习者跟着协议栈的串口底层一直到顶层转圈、转圈、再转圈,蒙圈了。实际上,从应用角度讲,我们根本就没有必要去深入的追究Zstack中串口的工作机制,也没有必要去搞清楚到底是怎么DMA和Interrupt的,我们只要调用几个简单函数就可以正常使用串口了。其实协议栈已经把使用串口的条件准备好了,我们何必再纠结硬件底层实现呢?应用者应该把协议栈看作一个平台,平台之上的应用才是我们的目标。下面我就讲一下如何利用协议栈现有平台来实现自己的串口应用。这里我所提及的现有平台即是Zstack自带的MT包,其实Zstack中的这个MT包功能相当强大,通过TI提供的ZTOOL工具可以用串口的方式同整个协议栈进行交互,在我们编写Zigbee应用程序的过程中,很多不知道该如何调用的函数都能在MT中找到参考!这个不多说了,有兴趣的同学可以去专门研究一下MT包。二、使用方法在MT包中,已经有了串口初始化即串口数据处理函数可用,关键的几个函数出现在MT_Uart.c文件中。我们拿出来几个关键函数说明一下(我捡重要语句注释):第一个函数void MT_UartInit (){ // 这个是MT中的一个串口初始化函数,主要作用是初始化串口工作的一些规矩halUARTCfg_t uartConfig;App_TaskID = 0; //处理串口数据的任务ID,可以先不管uartConfig.configured = TRUE;uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;//默认38400波特率;可以更改,但是可能有新问题,具体解释内容比较多,我不说;uartConfig.flowControl = FALSE;//MT_UART_DEFAULT_OVERFLOW;//禁止硬件流控,如果你的串口只有RXD,TXD和GND三条线,必须这么做;uartConfig.flowControlThreshold= MT_UART_DEFAULT_THRESHOLD;uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;uartConfig.intEnable = TRUE;#if defined (ZTOOL_P1) || defined (ZTOOL_P2)uartConfig.callBackFunc = MT_UartProcessZToolData;//如果编译的时候选择使用ZTOOL,那么MT_UartProcessZtoolData将会处理串口接到的数//据串#elif defined (ZAPP_P1) || defined (ZAPP_P2)uartConfig.callBackFunc = MT_UartProcessZAppData;//如果编译的时候没有选择ZTOOL,而是选择使用了ZAPP,则由MT_UartProcessZAppData//函数来处理串口数据串(*如果是用CC2530的P0口那两根串口引脚,你就要define ZTOOL_P1,如果是P1口的那两根串口引脚,你就要define ZTOOL_P2,对于ZAPP_P1和ZAPP_P2也是一个情况*)#elseuartConfig.callBackFunc = NULL;//这个地方,如果你有兴趣自己写一个串口处理函数,那么你实现一个My_UartProcessData//函数,然后填到这里,替换NULL。#endif#if defined (MT_UART_DEFAULT_PORT)HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);//如果定义了默认串口,(0或者1),打开串口,这个HalUartOpen函数会做一大堆工作,具//体说来就是初始化呗。。。,我没有必要展开。需要注意的是这个函数把前面哪一堆初始化//的uartConfig做为参数传进去了噢!#else(void)uartConfig;#endif#if defined (ZAPP_P1) || defined (ZAPP_P2)MT_UartMaxZAppBufLen = 1;MT_UartZAppRxStatus = MT_UART_ZAPP_RX_READY;//这两句,如果是不想使用MT_UartProcessZToolData来处理串口数据,就。。。。//再说就要深入串口机制了,网上讲解文章太多了,自己看吧,我一会儿使用//MT_UartProcessZToolData。#endif}第二个函数void MT_UartRegisterTaskID( byte taskID ){App_TaskID = taskID;}第三个函数void MT_UartProcessZToolData ( uint8 port, uint8 event )osal_msg_deallocate ( (uint8 *)pMsg );}我们往上看看这个Message是什么?MT_UartProcessZToolData函数开始不远的地方有以下程序段:if (pMsg){pMsg->hdr.event = CMD_SERIAL_MSG;pMsg->msg = (uint8*)(pMsg+1);pMsg->msg[MT_RPC_POS_LEN] = LEN_Token;state = CMD_STATE1;}从这里看到,这个函数建立了一个消息头,用CMD_SERIAL_MSG做为消息,那么osal_msg_send给任务的那个消息将会以CMD_SERIAL_MSG出现。。。。。。。好了,以上三个函数看完,我们试着使用一下:以GenericApp例子为例:void GenericApp_Init( byte task_id ){XXXXXXXXXXXXXXXXXXXXXXXXXX(这个函数的最后,其实放在这个函数的哪里都行)MT_UartInit(); //added by kennanMT_UartRegisterTaskID(GenericApp_TaskID);}再看一下MT_UartRegisterTaskID(GenericApp_TaskID):void MT_UartRegisterTaskID( byte taskID ){App_TaskID = taskID;}好了,这样,我们顺利地把串口发来的数据用MT_UartProcessZToolData来处理,并且把处理后的数据打包发给了任务GenericApp_TaskID。接下来,我们看一下在GenericApp_TaskID中如何处理吧。在GenericApp的主处理函数中:UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ){if ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t*)osal_msg_receive( GenericApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){case ZDO_CB_MSG:GenericApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );break;case KEY_CHANGE:GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t*)MSGpkt)->keys );break;//增加Case CMD_SERIAL_MSG:ProcessUartData((mtOSALSerialData_t *)MSGpkt); //这个函数你自己实现吧,想做啥呢?想做啥就做啥。如果想把接//到的数据发回串口,调用HalUARTWrite就行了。}如果你不知道如何提取串口消息并处理,我就好人做到底,帮你实现一个ProcessUartData()函数吧。这个函数的作用是把接收到的数据从CM0开始一直到payload的最后一个字节发送给串口回显,不包括校验字节噢。ProcessUartCommand((mtOSALSerialData_t *)MSGpkt){ //为了正确地进行下面工作,用mtOSALSerialData_t类型来指向整个zigbee数据包(不是串//口数据包)uint8 *pMsg;pMsg = MSGpkt->msg;//定义一个指针,指向真正的串口接收数据存放位置,MSGptk里面还有一些别的Header噢。switch ( MSGpkt->hdr.event ){case CMD_SERIAL_MSG://如果是串口消息。。。。HalLedSet( HAL_LED_RED, HAL_LED_MODE_FLASH );//用LED灯指示一下收到数据啦uint8 *pBuffer;uint8 datalength;uint8 i;//定义几个变量,为从接收到的串口包里面提取数据以及写回串口做准备datalength = *pMsg++;//串口包中第一个字节是数据长度噢pBuffer = osal_mem_alloc(datalength);//分配一块内存准备把串口消息数据拿出来if(pBuffer != NULL){for(i = 0;i < datalength; i++)*pBuffer++ = *pMsg++;//把消息中的串口数据按照datalength数量挨个捞出来放血(放血啥意思?把池子//里面那东西捞出来放血,明白不?HalUARTWrite(0,pBuffer,datalength);//捞出来放血的串口数据再写回串口,也就是送到串口助手显示Osal_memfree(pBuffer);//动态申请的内存记得用完了free一下噢}break;default:break;}}说明:因为ZTOOL发过来的数据是有格式的,所以如果你用串口助手来测试,那么发的数据要按照格式来,如果你不想按那个格式,你可以自己去修改MT_UartProcessZToolData里面的相关程序。这种方法对于想要通过PC来控制zigbee的应用场合非常实用,因为你PC发过来的一般也会有命令和数据,如果不用MT的格式,你自己也要规范一个格式,既然MT已经有了,我们就借用就好。对于MT_UartProcessZAppData这个处理方法,也就是你define了ZAPP_P1或ZAPP_P2的情况,其机制也是类似的,只不过没有规定格式,你更自由,这里我就不多说了。再有,如果你真的在测试的时候不知道那么一长串数据的xor 结果是多少,也可以去MT_UartProcessZToolData函数中,找到://if ((MT_UartCalcFCS ((uint8*)&pMsg->msg[0], MT_RPC_FRAME_HDR_SZ +LEN_Token) == FSC_Token)){osal_msg_send( App_TaskID, (byte *)pMsg );}else//{//osal_msg_deallocate ( (uint8 *)pMsg );//}把我标红的几个位置注释掉,就不会校验了,你也不用算xor结果了,不过发数据的时候这个位置还是要的,你随便填个0好了。
2023-07-06 04:19:221

我用的ZStack云主机的磁盘写满了,启动不了怎么办?

你可以尝试扩大磁盘,之后再启动,但是要是扩大的话,你得建议先备份镜像哈。具体操作可以去ZStack官网看看,应该有介绍。望采纳我的答案,不胜感激。如果还有什么需要,可以追问,谢谢!
2023-07-06 04:19:401

如何重新安装ZStack?

1. 先执行以下命令删除原本的数据库:rm -rf /usr/local/zstack注: 此命令会删除该目录下所有数据,如需彻底重装ZStack,才可使用。2. 再执行以下命令重装管理节点:bash ZStack-installer-3.0.1.bin -D #安装ZStack企业版
2023-07-06 04:19:471

在ZStack部署vCenter环境报错No dvSwitch found怎么办?

现象:报错如下: "org.zstack.vmware.APIAddVCenterMsg": { "domainName": "192.168.0.16", "name": "VC", "username": "administrator@vsphere.local", "password": "******", "https": "true", "zoneUuid": "631998da879f4b63b484876138c87a6a", "session": { "uuid": "5cec7c53f71344858a30186dd0d8280a", "callid": "api-mMa45Vw7" } } } { "success": false, "apiId": "476e659189ef4097b98dcf0ed4adc51c", "headers": { "api-id": "476e659189ef4097b98dcf0ed4adc51c", "schema": {} }, "session": { "callid": "api-mMa45Vw7", "uuid": "5cec7c53f71344858a30186dd0d8280a" }, "error": { "code": "SYS.1006", "description": "An operation failed", "details": "No dvSwitch found", "$$hashKey": "object:672" }, "createdTime": 1496300098050, "type": { "_name": "key.event.API.API_EVENT" }, "id": "872c5d4ab75e4fd88a69bec0f90b41fe" }? 原因及解决方案:vCenter环境需要先创建分布式交换机:VC CLUSTER HOST dvswitch。如果需要ZStack来接管vCenter,vCenter必须能先创建dvSwitch;ZStack创建云路由网络也基于dvSwitch。
2023-07-06 04:19:551

我这边的ZStack云主机控制台出现了Guest has not initialized the display (yet)是什么情况?

可能是因为你这边使用旧的服务器作为计算节点,可能会遇到因CPU型号过早,无法创建云主机或者创建的云主机不能显示console界面的问题,会出现下面这样的情况:出现这种情况的话,可以尝试以下做以下设置:a. kvm-nested.conf里面第一行加上ept=0,如:options kvm_intel nested=1 ept=0 #vim /etc/modprobe.d/kvm-nested.confb. 关闭运行状态的VM,然后移除kvm_intel:#rmmodkvm_intelc. 最后重新加载kvm_intel:#modprobekvm-intel ept=0 unrestricted_guest=0其实类似这样的问题你可以去ZStack的官网常见问题手册或者他们社群问一下,里面很多大佬随时在线解答。
2023-07-06 04:20:042

有大佬知道ZStack一个集群支持多个主存储吗? 支持不同类型的主存储搭配使用吗?

来来来,ZStack集群支持主存储汇总来了!ZStack支持一个主存储加载多个集群,一个集群挂载多个主存储,目前支持的场景有:一个集群可以挂载一个或多个本地主存储。一个集群可以挂载一个或多个NFS主存储。一个集群可以挂载一个或多个Shared Block主存储。一个集群可以挂载一个Shared Mount Point主存储。一个集群只能挂载一个Ceph主存储。
2023-07-06 04:20:221

Zstack中如何实现自己的任务 详细03

{ osal_pwrmgr_powerconserve(); // Put the processor/system into sleep } #endif } } //临界区资源管理 先看一个临界区代码保护的例子: HAL_ENTER_CRITICAL_SECTION(intState); events = activeTask->events; activeTask->events = 0; //清楚任务的事件 HAL_EXIT_CRITICAL_SECTION(intState); 其中:中断宏定义如下 #define HAL_ENABLE_INTERRUPTS() st( EA = 1; ) #define HAL_DISABLE_INTERRUPTS() st( EA = 0; ) #define HAL_INTERRUPTS_ARE_ENABLED() (EA) typedef unsigned char halIntState_t; #define HAL_ENTER_CRITICAL_SECTION(x) st( x = EA; HAL_DISABLE_INTERRUPTS(); ) #define HAL_EXIT_CRITICAL_SECTION(x) st( EA = x; ) #define HAL_CRITICAL_STATEMENT(x) st( halIntState_t s; HAL_ENTER_CRITICAL_SECTION(s); x; HAL_EXIT_CRITICAL_SECTION(s); ) 以及相关的st 宏: #define st(x) do { x } while (__LINE__ == -1) (1)cc2430 芯片中的中断使能的特殊功能寄存器(SFRs):IEN0,IEN1 和IEN2,(见 cc2430 datasheet: P49)。这三个寄存器的不同的位控制了不同的硬件的中断使能,比如IEN2 中的第五位WDTIE 控制着看门狗时钟的中断使能。这其中有一个比较特殊的位是IEN0 的第7 位,名称为EA,控制着所有中断的使能,为0 时 将没有中断相应,为1 时每一个中断源的使能受相应的位的控制。上面的宏即是用芯片的EA=0 来关中断实现临界资源的保护。 (2)set 宏定义如下,表示执行x 指令,注意x 是一个完整的语句,需要加分号。 #define st(x) do { x } while (__LINE__ == -1) 而整个宏的定义结束时没有分号,而是在最后的应用时加的分号,如: HAL_ENTER_CRITICAL_SECTION(intState); (3)HAL_ENABLE_INTERRUPTS()和HAL_DISABLE_INTERRUPTS()这两个宏分别实现了cc2430 的所有中断的开和关。HAL_ENTER_CRITICAL_SECTION(x)宏首先将 EA 的值保存在变量x 中,然后关闭所有中断,进行后面的临街资源处理。 HAL_EXIT_CRITICAL_SECTION(x)宏则是回复刚才保存在x 中的EA 的值。 HAL_CRITICAL_STATEMENT(x)宏的功能是将x 作为临界代码执行,首先声明了用于保存EA 值的变量,然后调用进入临界区宏,执行临界代码x,最后执行退出临界区的宏。 (4)注意HAL_CRITICAL_STATEMENT(x)这个宏,因为st 宏的实现中x 是一些可以执行的完整c 语句,更主要的是写在do{}while()中,它值一个子的程序片段,因此x 可以做很多事,比如声明变量等。否则你会奇怪,这样定义宏在宏展开的时候如果使用多个这个宏,会不会出现重复定义(HAL_CRITICAL_STATEMENT(x) 实现代码中的halIntState_t s;),会不会出现在程序的中间来定义变量(c语言要求要使用的变量需在最前面定义)等问题。其实这些问题是不会出现的,真是因为HAL_CRITICAL_STATEMENT(x)的x 的执行在do-while 中的do 子句中。 下面是一个类似的验证例子程序: #include #define st(x) do{x}while(__LINE__==-1) #define enable() st(EA = 1;) //使能所有中断 #define disable() st(EA = 0;) //关闭所有中断 #define enter(x) st(x = EA; disable();) //进入临界区 #define exit(x) st(EA = x;) //退出临界区 //简写临界代码的执行 #define critical(s) st(int temp; enter(temp); s; exit(temp);) //模拟控制所有中断的变量 int EA = 5; int main() { int a; enter(a); printf("EA=%d, a=%d ",EA,a); exit(a); //验证多次执行宏不会出现重复定义变量的问题 critical(printf("hello world-first ");); critical(printf("hello world-second ");); //上面的critical(printf("hello world-first "););展开后的等价代码 do { int temp; do{ temp = EA; do{ EA = 0; }while(__LINE__==-1); }while(__LINE__==-1); printf("hello world "); do{ EA =temp; }while(__LINE__==-1); }while(__LINE__==-1); //验证在子模块中可以再次声明变量 { int a = 12; printf("%d ",a); { int a = 89; printf("%d ",a); } } return 0; } 执行结果为: EA=0, a=5 hello world-first hello world-second hello world 12 89 PS: (1)c 程序中的各个宏定义的顺序任意。 (1)c 程序中要求变量需先定义所有要使用的变量,然后才使用,是对用一个层次模块来说,在子层次中可以遵循这个规则再次定义变量。一个花括号中的括起来的内容{...}可以看作一个子模块。 Zstack 设置发送功率(CC2530) 在mac_radio.c 中找到macRadioSetTxPower 函数,其具体内容复制如下: #ifndef HAL_MAC_USE_REGISTER_POWER_VALUES MAC_INTERNAL_API void macRadioSetTxPower(uint8 txPower) { halIntState_t s; #if defined MAC_RUNTIME_CC2591 || defined MAC_RUNTIME_CC2590 const uint8 CODE *pTable = macRadioDefsTxPwrTables[macRadioDefsRefTableId >> 4]; #elif defined HAL_PA_LNA || defined HAL_PA_LNA_CC2590 const uint8 CODE *pTable = macRadioDefsTxPwrTables[0]; #else const uint8 CODE *pTable = macRadioDefsTxPwrBare; //该table 中含有txPower 的设置值,将该table 的首地址赋给指针pTable, //macRadioDefsTxPwrBare[]定义在mac_radio_defs.c 中 #endif if ((int8)txPower > (int8)pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY]) { txPower = pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY];//发送功率上限值 } else if ((int8)txPower < (int8)pTable[MAC_RADIO_DEFS_TBL_TXPWR_LAST_ENTRY]) { txPower = pTable[MAC_RADIO_DEFS_TBL_TXPWR_LAST_ENTRY];//发送功率下限值 } HAL_ENTER_CRITICAL_SECTION(s); { uint8 index = pTable[MAC_RADIO_DEFS_TBL_TXPWR_FIRST_ENTRY] - txPower + MAC_RADIO_DEFS_TBL_TXPWR_ENTRIES; reqTxPower = pTable[index]; } //通过计算转换查表index,得到发送功率值,将其赋给reqTxPower, //函数macRadioUpdateTxPower 中用于更新发送功率 HAL_EXIT_CRITICAL_SECTION(s); macRadioUpdateTxPower(); } #else MAC_INTERNAL_API void macRadioSetTxPower(uint8 txPower) {//直接获得reqTxPower halIntState_t s; HAL_ENTER_CRITICAL_SECTION(s); reqTxPower = txPower; HAL_EXIT_CRITICAL_SECTION(s); macRadioUpdateTxPower(); } 下面了解一下macRadioUpdateTxPower 函数,其函数体如下: MAC_INTERNAL_API void macRadioUpdateTxPower(void) { halIntState_t s; HAL_ENTER_CRITICAL_SECTION(s);//进入临界区 if (reqTxPower != macPhyTxPower)//macPhyTxPower 即为当前实际的发送功率 { if (!macRxOutgoingAckFlag && !MAC_TX_IS_PHYSICALLY_ACTIVE()) //当有发送任务正在进行时,不能改变发送功率。 //当前的发送任务完成后,将重新调用该函数进行发送功率设置。 { macPhyTxPower = reqTxPower; MAC_RADIO_SET_TX_POWER(macPhyTxPower);//设置寄存器TXPOWER 为 macPhyTxPower,即reqTxPower } } HAL_EXIT_CRITICAL_SECTION(s);//离开临界区 } 通过上面的函数,我们根据自己的需要,适当对发送功率进行设置。 关于ZStack-CC2530-2.3.0-1.4.0 中simpleApp 例子的组网(一) 所有的C 语言编写的程序,入口函数一定是main 函数,首先看一下ZMain.c 函数。 int main( void ) { osal_int_disable( INTS_ALL ); HAL_BOARD_INIT(); zmain_vdd_check(); InitBoard( OB_COLD ); HalDriverInit(); osal_nv_init( NULL ); ZMacInit(); zmain_ext_addr(); zgInit(); #ifndef NONWK afInit(); #endif osal_init_system(); osal_int_enable( INTS_ALL ); InitBoard( OB_READY ); zmain_dev_info(); #ifdef LCD_SUPPORTED zmain_lcd_init(); #endif #ifdef WDT_IN_PM1 WatchDogEnable( WDTIMX ); #endif osal_start_system(); return 0; } 主函数要做的事情非常简单,首先进行了一些初始化,包括各层的初始化,硬件初始化,以及任务的初始化等,然后就进入到操作系统当中,即 osal_start_system(); 就再也出不来了。操作系统的作用就是如果有事件发生,就把这个消息通知给处理该事件的事件处理函数去执行,然后一直的循环查找有没有事件发生。另外说一下,事件是定义在任务当中的,即一个任务可能有多个事件,每个任务对应一个事件处理函数。在这个程序中,一共有6 个任务,有兴趣的同学可以自己查看void osalInitTasks( void )函数的代码。 接下来看一下zigbee 协调器是怎么建立网络的 首先我们必须选择SimpleCollectorEB 版本,在APP 文件下看到sapi.c 源文件。找到SAPI_Init(byte task_id)函数,此函数是进行sapi 层的初始化,代码如下 void SAPI_Init( byte task_id ) { sapi_TaskID = task_id;//将操作系统初始化任务时定义的任务id 号传进来 sapi_bindInProgress = 0xffff;//设置不允许绑定 sapi_epDesc.task_id = &sapi_TaskID;//给端口描述符的任务ID 号赋值,感觉也就是端口收到的数据或者消息就交给ID 号指定的任务来处理。 sapi_epDesc.endPoint = 0;//端口描述符端口号初始化为0。 #if ( SAPI_CB_FUNC )//编译通过 sapi_epDesc.endPoint = zb_SimpleDesc.EndPoint;//端口号赋值 sapi_epDesc.task_id = &sapi_TaskID;//任务ID 赋值,与上面的任务ID 的值是相同的。 sapi_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&zb_SimpleDesc;//简单描述符赋值,是描述一个端口最基本的信息 sapi_epDesc.latencyReq = noLatencyReqs;//这是一个枚举类型的,不清楚具体含义,不过大家都设成noLatencyReqs,除此之外还有两个值。 afRegister( &sapi_epDesc );//将定义的端点在AF 层注册,一定要注册后端点才会生效 #endif afSetMatch(sapi_epDesc.simpleDesc->EndPoint, FALSE);//设置描述符不能匹配 // Register callback evetns from the ZDApp ZDO_RegisterForZDOMsg( sapi_TaskID, NWK_addr_rsp );//在sapi 层注册网络地址事件,这个函数可以截取空中发来的消息,有兴趣的可以查查资料,第一个函数是截取的消息发到哪个任务中去,第二个参数,cluserID 是消息的类型。 ZDO_RegisterForZDOMsg( sapi_TaskID, Match_Desc_rsp );//同理,在sapi 层注册匹配描述符事件。 #if ( SAPI_CB_FUNC ) #if (defined HAL_KEY) && (HAL_KEY == TRUE) // Register for HAL events RegisterForKeys( sapi_TaskID );//注册按键响应事件 if ( HalKeyRead () == HAL_KEY_SW_5) { uint8 startOptions = ZCD_STARTOPT_CLEAR_STATE | ZCD_STARTOPT_CLEAR_CONFIG; zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions ); zb_SystemReset(); } #endif // HAL_KEY osal_set_event(task_id, ZB_ENTRY_EVENT);//在这里设置了一个进入事件,第一个参数是task_id 是任务的ID 号,因此我们可以在sapi 层的事件处理函数中找到这个进入事件是怎么处理的。 #endif } 在UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events )函数中,找到 if ( events & ZB_ENTRY_EVENT ) { uint8 startOptions; // Give indication to application of device startup #if ( SAPI_CB_FUNC ) zb_HandleOsalEvent( ZB_ENTRY_EVENT ); #endif // LED off cancels HOLD_AUTO_START blink set in the stack HalLedSet (HAL_LED_4, HAL_LED_MODE_OFF);//为了方便观察实验现象,将第四个灯关闭。 zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions ); if ( startOptions & ZCD_STARTOPT_AUTO_START ) { zb_StartRequest(); } else { // blink leds and wait for external input to config and restart HalLedBlink(HAL_LED_2, 0, 50, 500); } return (events ^ ZB_ENTRY_EVENT ); } 这个时候,程序就停在这里,只能看到LED_2 在闪烁。这个时候我们可以按下按键1,然后去找一下,事件处理函数中如何对此事件进行相应。找到UINT16 SAPI_ProcessEvent( byte task_id, UINT16 events )函数中的关于按键的处理: case KEY_CHANGE: #if ( SAPI_CB_FUNC ) zb_HandleKeys( ((keyChange_t *)pMsg)->state, ((keyChange_t *)pMsg)->keys ); #endif break; 进入到HandleKeys 函数中,找到 if ( keys & HAL_KEY_SW_1 ) { if ( myAppState == APP_INIT ) { zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType );//读取flash 中的设备类型 if ( logicalType != ZG_DEVICETYPE_ENDDEVICE ) { logicalType = ZG_DEVICETYPE_COORDINATOR;//将设备类型改变为协调器类型 zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);//将设备类型写入到flash 中 } zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );//读取启动模式 startOptions = ZCD_STARTOPT_AUTO_START;//将启动模式赋值为自动启动模式 zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );//将启动模式存入到flash 中 zb_SystemReset();//系统重启设置。这时候flash 中,启动模式就变成了ZCD_STARTOPT_AUTO_START,系统重启以后,系统继续刚才讲过的过程,不同的是在进行到进入事件处理函数时,if ( startOptions & ZCD_STARTOPT_AUTO_START )的值成立,调用if 语句里面的zb_StartRequest() 函数;即执行开始请求函数。 } 接下来进入到zb_StartRequest 函数中看一看,原代码如下: void zb_StartRequest() { uint8 logicalType; zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType );//从flash 中读出设备类型。 // Check for bad combinations of compile flag definitions and device type setting. if ((logicalType > ZG_DEVICETYPE_ENDDEVICE) || //可以判断if 里面语句为0,执行else #if !ZG_BUILD_ENDDEVICE_TYPE // Only RTR or Coord possible. (logicalType == ZG_DEVICETYPE_ENDDEVICE) || #endif #if !ZG_BUILD_RTR_TYPE // Only End Device possible. (logicalType == ZG_DEVICETYPE_ROUTER) || (logicalType == ZG_DEVICETYPE_COORDINATOR) || #elif ZG_BUILD_RTRONLY_TYPE // Only RTR possible. (logicalType == ZG_DEVICETYPE_COORDINATOR) || #elif !ZG_BUILD_JOINING_TYPE // Only Coord possible. (logicalType == ZG_DEVICETYPE_ROUTER) || #endif (0)) { logicalType = ZB_INVALID_PARAMETER; SAPI_SendCback(SAPICB_START_CNF, logicalType, 0); } else { logicalType = ZB_SUCCESS; //将设备类型改为ZB_SUCCESS ZDOInitDevice(zgStartDelay); // 执行初始化设备函数。 } return; } 那么接下来去初始化设备函数中看一下,右键,go to definition uint8 ZDOInitDevice( uint16 startDelay ) { uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; //首先更改了网络状态为初始化新网络状态 uint16 extendedDelay = 0; if ( devState == DEV_HOLD ) { zgInitItems( FALSE ); } ZDConfig_InitDescriptors(); _NIB.CapabilityInfo = ZDO_Config_Node_Descriptor.CapabilityFlags; devState = DEV_INIT; // 设备状态改为初始化 ZDApp_LeaveCtrlInit(); //离开控制初始化 ZDApp_LeaveCtrlStartup( &devState, &startDelay );//检查离开控制时的一些设置 if ( devState == DEV_HOLD ) { zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE ); osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT ); return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); } #if defined ( NV_RESTORE ) //NV_RESTORE 编译不通过,NV_RESTORE 主要是设置掉电再重新上电,参数是否保留 if ( HalKeyRead() == SW_BYPASS_NV ) networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; else { networkStateNV = ZDApp_ReadNetworkRestoreState(); } if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ) { networkStateNV = ZDApp_RestoreNetworkState(); } else { NLME_InitNV(); NLME_SetDefaultNV(); } #endif if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE ) { ZDAppDetermineDeviceType(); //确定设备类型 extendedDelay = (uint16)((NWK_START_DELAY + startDelay) + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK)); } ZDApp_SecInit( networkStateNV );// 初始化设备对象的安全操作 ZDApp_NetworkInit( extendedDelay ); //进行网络的初始化 NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags ); //网络层函数,代码看不到,看函数名字是设置广播地址掩码来支持广播过滤。不太明白这个。。。
2023-07-06 04:20:291

ZStack与openstack有什么差别吗?

ZStack是为IaaS层提供一套开源的管理产品,区别于Openstack和CloudStack,类似于个人操作系统中的Windows管理系统。其与openstack差别表现为:ZStack为成熟产品化公司,支持官网直接下载,简单易用,1台PC也可以上云,并且可以无缝升级,兼容利旧等。
2023-07-06 04:20:371

ZStack如何管理VMware虚拟机,能够做到什么程度?

我现在的版本是ZStack 2.5版本,在这个版本中有一个功能是Vcenter纳管VMware的云主机;支持查看VMware vCenter Server所管理的vSphere服务器资源和虚拟机资源;支持在虚拟数据中心中使用VMware vSphere资源,并在VMware vCenter集群中完成对云主机的常用操作;支持按不同的vCenter区分查看不同资源;支持以vCenter为单元对其下资源进行数据同步;支持云主机的创建、启动、停止、迁移、克隆、重启、暂停、恢复、关闭电源、修改计算规格、设置高可用、打开控制台、设置控制台密码、删除等全生命周期管理及常用功能;支持创建云路由网络和扁平网络,云路由网络支持所有ZStack网络服务;支持vSwitch/dvSwitch;支持按datastore区分主存储和镜像服务器;支持添加、启用、停用、删除镜像;支持物理机维护模式;支持vCenter物理机和虚拟机资源使用的实时监控;支持vCenter物理机和虚拟机的资源使用告警;
2023-07-06 04:20:461

ZStack管理节点IP地址怎么更改来着?

ZStack官网常见问题里面有类似的问题提示哈,一般来说要先更改然后重新启动,更改IP的话可以执行命令zstack-ctlchang_ip--ipX.X.X.X然后再执行命令zstack-ctlrestart_node重启管理节点。
2023-07-06 04:21:051

求助zigbee的ZSTACK协议栈定时器使用方法

1.首先要正确安装IAR编译器。 2.依次打开协议栈所在文件夹,如:ZStack-1.4.2-1.1.0ProjectszstackSamplesLocationCC2430DBSampleApp.eww (这是cc2430定位示例程序) 3.展开IAR编译器左边工作区workspace如: 这就是TI的zigbee协议栈
2023-07-06 04:21:241

如何查看zstack 版本信

root@Kylin:~# zstack-ctl status|grep versionversion: 3.7.1 (ZStack 3.7.1.31)
2023-07-06 04:21:312

如果用ZStack的一个集群挂载两个主存储,云盘怎么分配有人知道么?

ZStack中,允许一个集群添加两个主存储。但是如果主存储类型不同的话,比如一个LocalStorage和一个NFS。再次创建云主机,root盘将默认创建在LocalStorage,data盘将默认创建在NFS。这种情况需要注意一下哈。
2023-07-06 04:21:381

有人知道使用ZStack的时候网卡bond设置错,怎么修改么?

一般当系统上有多个网卡和IP地址的时候(比如说一个是内网,另一个外网),ZStack会默认选择系统默认路由使用的网卡IP地址。当然你也可以手动指定ZStack服务监听的IP地址:[root@ceph-host ~]# zstack-ctl configure management.server.ip=${MANAGEMENT_IP}其中,${MANAGEMENT_IP}是用户希望指定的IP地址。
2023-07-06 04:21:452

怎么在创建ZStack云主机时指定静态IP?

一般情况下,ZStack云主机的IP地址是由DHCP自动分配的。但是如果你需要静态IP的话,可以这样设置:? UI方式:停止云主机,进入云主机详情页,在配置信息页面选中云主机挂载的某网卡点击操作 > 设置静态IP。? 命令行方式:o 可使用SetVmStaticIp来设置:SetVmStaticIp vmInstanceUuid=7c4162e8d32d4bea8f7e799024c6b735 l3NetworkUuid=4d855bb0c72640f5a643ba8e88ae85df ip=10.141.13.85o 可使用systemTags=staticIp来设置:a. 开启DHCP服务(云路由网络或扁平网络都可以)。b. 执行以下命令:CreateVmInstance name=ceph-3 instanceOfferingUuid=7ec8f1148f14452aa359607112ce7bbe l3NetworkUuids=f749ec8b1ea94676bda7a5968de6b947 imageUuid=b6ebcfa021e24bc3b08a27216fd589a7 systemTags=staticIp::f749ec8b1ea94676bda7a5968de6b947::172.20.58.3
2023-07-06 04:21:542

我想更改ZStack的管理节点IP地址、数据库IP地址、消息总线IP地址,怎么才能快速修改啊?

需要修改管理节点IP地址,可以执行如下命令:[root@localhost ~]# zstack-ctl change_ip --ip NEW_IP # NEW_IP为新的管理节点IP地址 [root@localhost ~]# zstack-ctl restart_node执行上述命令默认会将管理节点IP、消息总线IP和数据库IP地址都变更为最新。如果用户单独配置了消息总线和数据库的IP地址,需执行如下命令:[root@localhost ~]# zstack-ctl change_ip --ip NEW_IP --cloudbus_server_ip NEW_IP_1 --mysql_ip NEW_IP_2 [root@localhost ~]# zstack-ctl restart_node
2023-07-06 04:22:031

ZStack开源技术怎么样啊?

当然好了,ZStack可是一家自主创新的、非OpenStack厂商,而且核心代码都是开源的,想象一下每一行代码都是他们自己敲的,会不会觉得很牛。
2023-07-06 04:22:121

怎么才能把ZStack管理节点从一台物理机迁移到另一台物理机?

a. 在原管理端备份数据库,备份文件提示导出至 /var/lib/zstack/mysql-backup/:[root@old-zstack ~]#zstack-ctl dump_mysql Backup mysql successful! You can check the file at /var/lib/zstack/mysql-backup/zstack-backup-db-2016-07-05_18-13-11.gzb. 停止原管理端服务:[root@old-zstack ~]#zstack-ctl stop c. 将备份数据库转移至新服务器,并在新管理端导入数据库:[root@new-zstack ~]#zstack-ctl restore_mysql --from-file=/root/zstack-backup-db-2016-07-05_18-13-11.gz --mysql-root-password=zstack.mysql.password the management node has been stopped Starting recover data ... Recover data successfully! You can start node by: zstack-ctl startd. 导入许可证:[root@new-zstack ~]# zstack-ctl install_license -f ZStack-license.txte. 启动新管理端服务:[root@new-zstack ~]#zstack-ctl start f. 这时,可直接登录ZStack的UI界面进行物理机、主存储、镜像服务器等硬件资源的管理,如果原有物理机的IP地址有变更可以直接在UI界面修改并重新连接。类似这样的具体操作问题可以去ZStack官网搜一下,或者联系他们的400电话,官网都有,会有技术人员指导的哈。
2023-07-06 04:22:182

ZStack怎么修改UI界面默认的5000端口啊?

可以尝试依次执行以下命令:[root@localhost ~]# zstack-ctl config_ui --server-port 8888 #修改UI服务端口为8888 [root@localhost ~]# zstack-ctl config_ui --webhook-port 8888 #改webhook主机端口,与UI服务端口保持一致 [root@localhost ~]# zstack-ctl stop_ui #停止UI服务 [root@localhost ~]# zstack-ctl start_ui #启动UI服务
2023-07-06 04:22:285

有人知道ZStack是怎么实现物理主机与云主机互通的么?

只要物理主机和云主机在一个大二层网络中,且处于相同的网络段,就可以互通。扁平网络、公有网络都可以。
2023-07-06 04:22:461

Zstack是什么

Zstack 是ZigBee的一种协议栈,是TI公司的。
2023-07-06 04:23:062

zstack怎么添加多个host

1、准备host节点,安装zstackmanagementnode-host节点可以是物理机或虚拟机,需要安装zstackmanagementnode软件并启动相关服务-zstackmanagementnode将host节点汇报到zstack管理节点,用于资源监控和管理。2、在zstackweb界面添加host节点-登录zstack管理节点web界面,点击左侧“Hosts”菜单-点击右上角“AddHost”按钮,进入添加host节点界面。3、填写host节点信息-HostName:输入host节点名字,如host1,host2等。-ManagementIP:输入host节点的管理IP(zstackmanagementnode绑定的IP)。-Cluster:选择将host节点加入的集群,一个集群下host节点的资源可以互相切换使用。-HostTags:可选,为host节点添加标签以用于分类过滤。4、验证ssh连接并批准-zstack需要通过ssh连接到host管理节点,需要在此处输入登录host节点的用户名和密码。-验证通过后点击“Approve”,host节点即开始加入zstack资源池,状态变为“Processing”。5、host节点上报资源并正常运行-host节点加入zstack后,zstackmanagementnode会自动上报host节点的CPU、内存、磁盘等资源信息。-上报完成后,host节点状态变更为“Connected”,表示host已经正常加入zstack,资源可供使用。6、(可选)设置自动承载标签和管理标签-可以为host节点设置自动承载标签和管理标签(HostAllocateTags和HostManagementTags)。-自动承载标签会自动将符合标签的虚拟机存量和增量部署到该host节点。-管理标签用于批量管理具有相同标签的多个host节点。
2023-07-06 04:23:131

zstack超融合一体机默认用户名密码

默认账户名:admin,默认初始密码:password。系统首次登录时,默认账户名:admin,默认初始密码:password。ZStack登录方式支持:账户登录:需输入账户名和账户密码。用户登录:需输入用户名和用户密码。AD/LDAP登录:需输入登录属性名和AD/LDAP密码。
2023-07-06 04:23:201

zstack中怎样通过串口接收数据

网上和论坛里面很多帖子都把精力集中到分析协议栈的串口工作机制上,比如分析DMA工作原理,中断工作原理,然后分析输入和输出Buffer的处理等内容,学习者跟着协议栈的串口底层一直到顶层转圈、转圈、再转圈,蒙圈了。实际上,从应用角度讲,我们根本就没有必要去深入的追究Zstack中串口的工作机制,也没有必要去搞清楚到底是怎么DMA和Interrupt的,我们只要调用几个简单函数就可以正常使用串口了。其实协议栈已经把使用串口的条件准备好了,我们何必再纠结硬件底层实现呢?应用者应该把协议栈看作一个平台,平台之上的应用才是我们的目标。下面我就讲一下如何利用协议栈现有平台来实现自己的串口应用。这里我所提及的现有平台即是Zstack自带的MT包,其实Zstack中的这个MT包功能相当强大,通过TI提供的ZTOOL工具可以用串口的方式同整个协议栈进行交互,在我们编写Zigbee应用程序的过程中,很多不知道该如何调用的函数都能在MT中找到参考!这个不多说了,有兴趣的同学可以去专门研究一下MT包。二、使用方法在MT包中,已经有了串口初始化即串口数据处理函数可用,关键的几个函数出现在MT_Uart.c文件中。我们拿出来几个关键函数说明一下(我捡重要语句注释):第一个函数void MT_UartInit (){ // 这个是MT中的一个串口初始化函数,主要作用是初始化串口工作的一些规矩halUARTCfg_t uartConfig;App_TaskID = 0; //处理串口数据的任务ID,可以先不管uartConfig.configured = TRUE;uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;//默认38400波特率;可以更改,但是可能有新问题,具体解释内容比较多,我不说;uartConfig.flowControl = FALSE;//MT_UART_DEFAULT_OVERFLOW;//禁止硬件流控,如果你的串口只有RXD,TXD和GND三条线,必须这么做;uartConfig.flowControlThreshold= MT_UART_DEFAULT_THRESHOLD;uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;uartConfig.intEnable = TRUE;#if defined (ZTOOL_P1) || defined (ZTOOL_P2)uartConfig.callBackFunc = MT_UartProcessZToolData;//如果编译的时候选择使用ZTOOL,那么MT_UartProcessZtoolData将会处理串口接到的数//据串#elif defined (ZAPP_P1) || defined (ZAPP_P2)uartConfig.callBackFunc = MT_UartProcessZAppData;//如果编译的时候没有选择ZTOOL,而是选择使用了ZAPP,则由MT_UartProcessZAppData//函数来处理串口数据串(*如果是用CC2530的P0口那两根串口引脚,你就要define ZTOOL_P1,如果是P1口的那两根串口引脚,你就要define ZTOOL_P2,对于ZAPP_P1和ZAPP_P2也是一个情况*)#elseuartConfig.callBackFunc = NULL;//这个地方,如果你有兴趣自己写一个串口处理函数,那么你实现一个My_UartProcessData//函数,然后填到这里,替换NULL。#endif#if defined (MT_UART_DEFAULT_PORT)HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);//如果定义了默认串口,(0或者1),打开串口,这个HalUartOpen函数会做一大堆工作,具//体说来就是初始化呗。。。,我没有必要展开。需要注意的是这个函数把前面哪一堆初始化//的uartConfig做为参数传进去了噢!#else(void)uartConfig;#endif#if defined (ZAPP_P1) || defined (ZAPP_P2)MT_UartMaxZAppBufLen = 1;MT_UartZAppRxStatus = MT_UART_ZAPP_RX_READY;//这两句,如果是不想使用MT_UartProcessZToolData来处理串口数据,就。。。。//再说就要深入串口机制了,网上讲解文章太多了,自己看吧,我一会儿使用//MT_UartProcessZToolData。#endif}第二个函数void MT_UartRegisterTaskID( byte taskID ){App_TaskID = taskID;}第三个函数void MT_UartProcessZToolData ( uint8 port, uint8 event )osal_msg_deallocate ( (uint8 *)pMsg );}我们往上看看这个Message是什么?MT_UartProcessZToolData函数开始不远的地方有以下程序段:if (pMsg){pMsg->hdr.event = CMD_SERIAL_MSG;pMsg->msg = (uint8*)(pMsg+1);pMsg->msg[MT_RPC_POS_LEN] = LEN_Token;state = CMD_STATE1;}从这里看到,这个函数建立了一个消息头,用CMD_SERIAL_MSG做为消息,那么osal_msg_send给任务的那个消息将会以CMD_SERIAL_MSG出现。。。。。。。好了,以上三个函数看完,我们试着使用一下:以GenericApp例子为例:void GenericApp_Init( byte task_id ){XXXXXXXXXXXXXXXXXXXXXXXXXX(这个函数的最后,其实放在这个函数的哪里都行)MT_UartInit(); //added by kennanMT_UartRegisterTaskID(GenericApp_TaskID);}再看一下MT_UartRegisterTaskID(GenericApp_TaskID):void MT_UartRegisterTaskID( byte taskID ){App_TaskID = taskID;}好了,这样,我们顺利地把串口发来的数据用MT_UartProcessZToolData来处理,并且把处理后的数据打包发给了任务GenericApp_TaskID。接下来,我们看一下在GenericApp_TaskID中如何处理吧。在GenericApp的主处理函数中:UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ){ if ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t*)osal_msg_receive( GenericApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){case ZDO_CB_MSG:GenericApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );break;case KEY_CHANGE:GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t*)MSGpkt)->keys );break;//增加Case CMD_SERIAL_MSG: ProcessUartData((mtOSALSerialData_t *)MSGpkt); //这个函数你自己实现吧,想做啥呢?想做啥就做啥。如果想把接//到的数据发回串口,调用HalUARTWrite就行了。}如果你不知道如何提取串口消息并处理,我就好人做到底,帮你实现一个ProcessUartData()函数吧。这个函数的作用是把接收到的数据从CM0开始一直到payload的最后一个字节发送给串口回显,不包括校验字节噢。ProcessUartCommand((mtOSALSerialData_t *)MSGpkt){ //为了正确地进行下面工作,用mtOSALSerialData_t类型来指向整个zigbee数据包(不是串//口数据包)uint8 *pMsg; pMsg = MSGpkt->msg;//定义一个指针,指向真正的串口接收数据存放位置,MSGptk里面还有一些别的Header噢。switch ( MSGpkt->hdr.event ){case CMD_SERIAL_MSG://如果是串口消息。。。。HalLedSet( HAL_LED_RED, HAL_LED_MODE_FLASH );//用LED灯指示一下收到数据啦uint8 *pBuffer;uint8 datalength;uint8 i;//定义几个变量,为从接收到的串口包里面提取数据以及写回串口做准备datalength = *pMsg++;//串口包中第一个字节是数据长度噢pBuffer = osal_mem_alloc(datalength);//分配一块内存准备把串口消息数据拿出来if(pBuffer != NULL){for(i = 0;i < datalength; i++) *pBuffer++ = *pMsg++;//把消息中的串口数据按照datalength数量挨个捞出来放血(放血啥意思?把池子//里面那东西捞出来放血,明白不?HalUARTWrite(0,pBuffer,datalength);//捞出来放血的串口数据再写回串口,也就是送到串口助手显示Osal_memfree(pBuffer);//动态申请的内存记得用完了free一下噢}break;default:break;}}说明:因为ZTOOL发过来的数据是有格式的,所以如果你用串口助手来测试,那么发的数据要按照格式来,如果你不想按那个格式,你可以自己去修改MT_UartProcessZToolData里面的相关程序。这种方法对于想要通过PC来控制zigbee的应用场合非常实用,因为你PC发过来的一般也会有命令和数据,如果不用MT的格式,你自己也要规范一个格式,既然MT已经有了,我们就借用就好。对于MT_UartProcessZAppData这个处理方法,也就是你define了ZAPP_P1或ZAPP_P2的情况,其机制也是类似的,只不过没有规定格式,你更自由,这里我就不多说了。再有,如果你真的在测试的时候不知道那么一长串数据的xor 结果是多少,也可以去MT_UartProcessZToolData函数中,找到://if ((MT_UartCalcFCS ((uint8*)&pMsg->msg[0], MT_RPC_FRAME_HDR_SZ +LEN_Token) == FSC_Token)){osal_msg_send( App_TaskID, (byte *)pMsg );}else//{//osal_msg_deallocate ( (uint8 *)pMsg );//}把我标红的几个位置注释掉,就不会校验了,你也不用算xor结果了,不过发数据的时候这个位置还是要的,你随便填个0好了。
2023-07-06 04:23:271

zstack安装时netframework错误怎么办

重新启动安装程序。步骤如下:。在桌面右键单击计算机,选择管理进入。1、在计算机管理先打开服务和应用程序-服务。2、单击服务打开,在列表中找到WindowsUpdate服务项。3、右键单击WindowsUpdate服务项,选择停止。4、按住Win+R组合键打开运行对话框,输入%windir%点击确定按钮。5、在打开的文件夹找到SoftwareDistribution文件夹,右键单击--重命名,将其重命名为SDold。6、回到windowsupdate服务项,右键重新启动,就可以顺利安装。
2023-07-06 04:23:331

如何在Zstack中使用串口

网上和论坛里面很多帖子都把精力集中到分析协议栈的串口工作机制上,比如分析DMA工作原理,中断工作原理,然后分析输入和输出Buffer的处理等内容,学习者跟着协议栈的串口底层一直到顶层转圈、转圈、再转圈,蒙圈了。实际上,从应用角度讲,我们根本就没有必要去深入的追究Zstack中串口的工作机制,也没有必要去搞清楚到底是怎么DMA和Interrupt的,我们只要调用几个简单函数就可以正常使用串口了。其实协议栈已经把使用串口的条件准备好了,我们何必再纠结硬件底层实现呢?应用者应该把协议栈看作一个平台,平台之上的应用才是我们的目标。下面我就讲一下如何利用协议栈现有平台来实现自己的串口应用。这里我所提及的现有平台即是Zstack自带的MT包,其实Zstack中的这个MT包功能相当强大,通过TI提供的ZTOOL工具可以用串口的方式同整个协议栈进行交互,在我们编写Zigbee应用程序的过程中,很多不知道该如何调用的函数都能在MT中找到参考!这个不多说了,有兴趣的同学可以去专门研究一下MT包。二、使用方法在MT包中,已经有了串口初始化即串口数据处理函数可用,关键的几个函数出现在MT_Uart.c文件中。我们拿出来几个关键函数说明一下(我捡重要语句注释):第一个函数void MT_UartInit (){ // 这个是MT中的一个串口初始化函数,主要作用是初始化串口工作的一些规矩halUARTCfg_t uartConfig;App_TaskID = 0; //处理串口数据的任务ID,可以先不管uartConfig.configured = TRUE;uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;//默认38400波特率;可以更改,但是可能有新问题,具体解释内容比较多,我不说;uartConfig.flowControl = FALSE;//MT_UART_DEFAULT_OVERFLOW;//禁止硬件流控,如果你的串口只有RXD,TXD和GND三条线,必须这么做;uartConfig.flowControlThreshold= MT_UART_DEFAULT_THRESHOLD;uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;uartConfig.intEnable = TRUE;#if defined (ZTOOL_P1) || defined (ZTOOL_P2)uartConfig.callBackFunc = MT_UartProcessZToolData;//如果编译的时候选择使用ZTOOL,那么MT_UartProcessZtoolData将会处理串口接到的数//据串#elif defined (ZAPP_P1) || defined (ZAPP_P2)uartConfig.callBackFunc = MT_UartProcessZAppData;//如果编译的时候没有选择ZTOOL,而是选择使用了ZAPP,则由MT_UartProcessZAppData//函数来处理串口数据串(*如果是用CC2530的P0口那两根串口引脚,你就要define ZTOOL_P1,如果是P1口的那两根串口引脚,你就要define ZTOOL_P2,对于ZAPP_P1和ZAPP_P2也是一个情况*)#elseuartConfig.callBackFunc = NULL;//这个地方,如果你有兴趣自己写一个串口处理函数,那么你实现一个My_UartProcessData//函数,然后填到这里,替换NULL。#endif#if defined (MT_UART_DEFAULT_PORT)HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);//如果定义了默认串口,(0或者1),打开串口,这个HalUartOpen函数会做一大堆工作,具//体说来就是初始化呗。。。,我没有必要展开。需要注意的是这个函数把前面哪一堆初始化//的uartConfig做为参数传进去了噢!#else(void)uartConfig;#endif#if defined (ZAPP_P1) || defined (ZAPP_P2)MT_UartMaxZAppBufLen = 1;MT_UartZAppRxStatus = MT_UART_ZAPP_RX_READY;//这两句,如果是不想使用MT_UartProcessZToolData来处理串口数据,就。。。。//再说就要深入串口机制了,网上讲解文章太多了,自己看吧,我一会儿使用//MT_UartProcessZToolData。#endif}第二个函数void MT_UartRegisterTaskID( byte taskID ){App_TaskID = taskID;}第三个函数void MT_UartProcessZToolData ( uint8 port, uint8 event )osal_msg_deallocate ( (uint8 *)pMsg );}我们往上看看这个Message是什么?MT_UartProcessZToolData函数开始不远的地方有以下程序段:if (pMsg){pMsg->hdr.event = CMD_SERIAL_MSG;pMsg->msg = (uint8*)(pMsg+1);pMsg->msg[MT_RPC_POS_LEN] = LEN_Token;state = CMD_STATE1;}从这里看到,这个函数建立了一个消息头,用CMD_SERIAL_MSG做为消息,那么osal_msg_send给任务的那个消息将会以CMD_SERIAL_MSG出现。。。。。。。好了,以上三个函数看完,我们试着使用一下:以GenericApp例子为例:void GenericApp_Init( byte task_id ){XXXXXXXXXXXXXXXXXXXXXXXXXX(这个函数的最后,其实放在这个函数的哪里都行)MT_UartInit(); //added by kennanMT_UartRegisterTaskID(GenericApp_TaskID);}再看一下MT_UartRegisterTaskID(GenericApp_TaskID):void MT_UartRegisterTaskID( byte taskID ){App_TaskID = taskID;}好了,这样,我们顺利地把串口发来的数据用MT_UartProcessZToolData来处理,并且把处理后的数据打包发给了任务GenericApp_TaskID。接下来,我们看一下在GenericApp_TaskID中如何处理吧。在GenericApp的主处理函数中:UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ){ if ( events & SYS_EVENT_MSG ){MSGpkt = (afIncomingMSGPacket_t*)osal_msg_receive( GenericApp_TaskID );while ( MSGpkt ){switch ( MSGpkt->hdr.event ){case ZDO_CB_MSG:GenericApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );break;case KEY_CHANGE:GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t*)MSGpkt)->keys );break;//增加Case CMD_SERIAL_MSG: ProcessUartData((mtOSALSerialData_t *)MSGpkt); //这个函数你自己实现吧,想做啥呢?想做啥就做啥。如果想把接//到的数据发回串口,调用HalUARTWrite就行了。}如果你不知道如何提取串口消息并处理,我就好人做到底,帮你实现一个ProcessUartData()函数吧。这个函数的作用是把接收到的数据从CM0开始一直到payload的最后一个字节发送给串口回显,不包括校验字节噢。ProcessUartCommand((mtOSALSerialData_t *)MSGpkt){ //为了正确地进行下面工作,用mtOSALSerialData_t类型来指向整个zigbee数据包(不是串//口数据包)uint8 *pMsg; pMsg = MSGpkt->msg;//定义一个指针,指向真正的串口接收数据存放位置,MSGptk里面还有一些别的Header噢。switch ( MSGpkt->hdr.event ){case CMD_SERIAL_MSG://如果是串口消息。。。。HalLedSet( HAL_LED_RED, HAL_LED_MODE_FLASH );//用LED灯指示一下收到数据啦uint8 *pBuffer;uint8 datalength;uint8 i;//定义几个变量,为从接收到的串口包里面提取数据以及写回串口做准备datalength = *pMsg++;//串口包中第一个字节是数据长度噢pBuffer = osal_mem_alloc(datalength);//分配一块内存准备把串口消息数据拿出来if(pBuffer != NULL){for(i = 0;i < datalength; i++) *pBuffer++ = *pMsg++;//把消息中的串口数据按照datalength数量挨个捞出来放血(放血啥意思?把池子//里面那东西捞出来放血,明白不?HalUARTWrite(0,pBuffer,datalength);//捞出来放血的串口数据再写回串口,也就是送到串口助手显示Osal_memfree(pBuffer);//动态申请的内存记得用完了free一下噢}break;default:break;}}说明:因为ZTOOL发过来的数据是有格式的,所以如果你用串口助手来测试,那么发的数据要按照格式来,如果你不想按那个格式,你可以自己去修改MT_UartProcessZToolData里面的相关程序。这种方法对于想要通过PC来控制zigbee的应用场合非常实用,因为你PC发过来的一般也会有命令和数据,如果不用MT的格式,你自己也要规范一个格式,既然MT已经有了,我们就借用就好。对于MT_UartProcessZAppData这个处理方法,也就是你define了ZAPP_P1或ZAPP_P2的情况,其机制也是类似的,只不过没有规定格式,你更自由,这里我就不多说了。再有,如果你真的在测试的时候不知道那么一长串数据的xor 结果是多少,也可以去MT_UartProcessZToolData函数中,找到://if ((MT_UartCalcFCS ((uint8*)&pMsg->msg[0], MT_RPC_FRAME_HDR_SZ +LEN_Token) == FSC_Token)){osal_msg_send( App_TaskID, (byte *)pMsg );}else//{//osal_msg_deallocate ( (uint8 *)pMsg );//}把我标红的几个位置注释掉,就不会校验了,你也不用算xor结果了,不过发数据的时候这个位置还是要的,你随便填个0好了。
2023-07-06 04:23:401

使用ZStack的时候没找到Windows virtio ISO的镜像,有人知道在哪么?

在管理节点/opt/zstack-dvd目录,内置zstack-windows-virtio-driver-2.1.iso镜像
2023-07-06 04:23:471

ZStack的计算节点一直显示重连中但是却连接不上怎么处理有人知道么?

你可以登录该计算机点,依次执行如下命令,完成后在UI界面重连计算节点:[root@10-0-5-87 ~]# service libvirtd restart [root@10-0-5-87 ~]# service virtlogd restart [root@10-0-5-87 ~]# /etc/init.d/zstack-kvmagent stop这个解决办法不行的话你可以去他们官网搜下常见问题里看有没有其他解决方案,或者直接打商务电话咨询技术好像也可以。
2023-07-06 04:23:541

ZStack的DHCP服务是谁提供的?

一般来说,用户使用的电脑,若需要连接到互联网上,则连接互联网的机器就必须要有一个合法的动态 IP 地址。而获取到这个动态 IP 地址的过程就是由 DHCP 服务器完成的。该服务器是由 ISP(Internet服务提供商)进行提供的。
2023-07-06 04:24:012

ZStack计算节点使用Ceph存储时,在创建、启动、迁移云主机时,出现以下错误

一般遇到这种情况是由于计算节点在连接Ceph时,丢失密钥,需要删除密钥,重连物理机就可以了。你可以尝试进行以下步骤进行修复:a.在出现问题的计算节点执行virshsecret-list获取其uuid。例如:获取uuid为03b5ee0d-df21-46d2-9927-7c930333cb70root@ceph-host~]#virshsecret-listUUIDUsage--------------------------------------------------------------------------------03b5ee0d-df21-46d2-9927-7c930333cb70ceph03b5ee0d-df21-46d2-9927-7c930333cb70b.执行virshsecret-undefine03b5ee0d-df21-46d2-9927-7c930333cb70删除其密钥。[root@ceph-host~]#virshsecret-undefine03b5ee0d-df21-46d2-9927-7c930333cb70secret03b5ee0d-df21-46d2-9927-7c930333cb70deletedc.执行/etc/init.d/zstack-kvmagentstop停止管理节点agent。[root@ceph-host~]#/etc/init.d/zstack-kvmagentstop2017-05-0810:07:57,590DEBUG[zstacklib.utils.shell]/sbin/iptables-save2017-05-0810:07:57,596DEBUG[zstacklib.utils.iptables]removedemptychains:[]2017-05-0810:07:57,598DEBUG[zstacklib.utils.shell]/sbin/iptables-restore</tmp/tmpBW4mWXStopDaemon...StopDaemonSuccessfullystopzstackkvmagent....SUCCESSd.在UI界面再次重连此计算节点,重连成功后,创建、启动、迁移云主机即可正常。目前ZStack在UI已提供关闭CephX密钥认证选项,下次再遇到这种问题可以去他们官网搜一下,应该大部分都有解答。
2023-07-06 04:24:081

ZStack一个集群可以挂多少存储?有限制吗?

从我司实际的使用效果上来看,一个集群可以挂载多个主存储。在使用上,有以下限制:一个集群可以挂载一个或多个本地主存储;一个集群可以挂载一个或多个NFS主存储;一个集群可以挂载一个或多个Shared Block主存储(FCSAN/IPSAN);一个集群可以挂载一个本地主存储和一个NFS主存储;一个集群可以挂载一个本地主存储和一个Shared Block主存储(FCSAN/IPSAN);一个集群只能挂载一个Ceph主存储。
2023-07-06 04:24:271

一键安装ZStack后,启动时间过长怎么办?

原因:管理节点启动时间与节点配置资源有关,在云主机上安装ZStack才出现时间过长的情况。解决方案:建议使用虚拟环境时,配置CPU>4,内存>16G。注:时间过长不代表安装启动失败,time out报错后请先使用zstack-ctl status查看状态。 如果为stopped状态,使用zstack-ctl start启动即可;如果为unknown状态,需要先使 用zstack-ctl stop停止,再使用zstack-ctl start启动。
2023-07-06 04:24:331