1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,
有一个PSoC 4 BLE编程与先锋工具包CasSoSE接近实例作为外围设备/服务器。要设置另一个对应的中心/客户端。从先锋工具包IAS中心示例开始,并将Mind Mind配置文件更改为自定义,然后在BLE组件中复制自定义CAPSENSE服务。让两个连接,现在需要对客户端进行编码,以便在服务器上启用通知。大量的例子和阅读API,但仍然很困惑,要使用哪种API命令以及参数具体需要什么。具体地说,如何指定定制的CAPSENSE服务ccCD,并将其值设置为API函数中的0x01? 那么如何实际阅读通知呢? 以上来自于百度翻译 以下为原文 Hello All, Have one PSOC 4 BLE programmed with the Pioneer kit CapSense Proximity Example acting as the Peripheral/Server. Want to set up another to be the corresponding Central/Client. Started from the Pioneer kit IAS Central Example and changed the Find Me Profile to Custom then duplicated the custom CapSense service in the BLE component. Got the two to connect, now need to code the client to enable notifications on the server. Been pouring over examples and reading the API but still very confused as to which API command to use and what the arguments specifically need to be. Specifically how to specify the custom CapSense service CCCD and set it's value to 0x01 in the API function? Then how to actually read the notifications? |
|
相关推荐
13个回答
|
|
在读取数据之前,恐怕我仍然停留在启用通知上。我从调用到 APIREST = CyBLUG GATCSCRUTER特征描述符(CyByLyCon句柄,and RealSereQPARAM); CyByErrRySimuldId参数“CONDACTURE”值不表示堆栈中的任何现有条目 从Windows 10发送邮件 6ED70DF67 E514116B359E4F766 D788 82.PNG 148字节 以上来自于百度翻译 以下为原文 Before getting to reading the data, afraid I am still stuck on enabling notifications. I get this error back from the call to : apiResult=CyBle_GattcWriteCharacteristicDescriptors(cyBle_connHandle, &writeReqParam); CYBLE_ERROR_INVALID_PARAMETER 'connHandle' value does not represent any existing entry in the Stack Sent from Mail for Windows 10
|
|
|
|
hongqiaolian 发表于 2019-1-2 19:46 Cn句柄是指将通知设置写入客户端的外围设备;这需要您与蓝牙连接到设备。如果您试图调用该函数而不连接到外围设备,那么它将抛出您所看到的错误。 首先在蓝牙上连接到外围设备,然后调用WrreEngect描述符来设置通知设置。 以上来自于百度翻译 以下为原文 The connHandle refers to writing the notification settings to the peripheral from the client; This requires you to be connected with bluetooth to the device. If you are trying to call that function without being connected to the peripheral, then it will throw the error you are seeing. Connect to the peripheral over bluetooth first, then call the writecharacteristicdescriptors to set the notification settings. |
|
|
|
要读取该值,您将要这样做: 接近值=数据处理-gt; 前面的星号是不必要的,就像C++中的那样,它将引用指针。但是,-gt将在访问指向指向的对象的值(同时基本上同时执行这两个步骤)时引用指针。这意味着,您将查看由数据化指针指向的指针指向的对象。 在C++中,*PoalValue.ValueAccess等同于PoTaleValue& Gt:ValueAccess,只是语法略有不同(并且可能略有不同的编译/执行,但本质上是相同的影响)。 以上来自于百度翻译 以下为原文 To read the value, you will want to do: proximityvalue = Datanotification->handleValPair.value.val; The asterisk in the front is unecessary, as in c++ that will dereference a pointer. But, the -> will dereference a pointer while accessing a value from the object pointed to (basically doing both steps at the same time). This means that you would be looking at the object pointed to by the pointer which is pointed to by the DataNotification pointer. In C++, *PointerValue.ValueAccess is equivalent to PointerValue->ValueAccess just with slightly different syntax (and possible slightly different compilation/execution, but essentially the same affect). |
|
|
|
yuhe82 发表于 2019-1-2 20:01 我假设建立连接将是在两个BLE设备之间传递参数和数据的先决条件。在PSOCK44BLYCENTROLALIAIAS先驱板上的蓝色状态从闪烁到固态,而在PSoClO4BLULL CAPENSESEA接近模块(单独供电)上的状态从闪烁到关闭,根据这两组文档表明两者都是连接的。作为一个测试,我复位(按钮)PSoCl44Blul-CassEnSeX接近模块后,他们被连接,并观察到蓝色LED上的PSoClO4BLYLCITALALIAIAS先驱板走出去。 在函数参数中也尝试了Cal句柄和CyByLyCon句柄,结果相同。 非常感谢你的帮助和耐心。将继续调查。 从Windows 10发送邮件 17078B4Db52C40399 2C6AD366B2A4A9E.PNG 148字节 以上来自于百度翻译 以下为原文 I had assumed establishing a connection would be a prerequisite to passing parameters and data between two BLE devices. The blue status LED on the PSoC_4_BLE_Central_IAS Pioneer board goes from flashing to solid while the status LED on the PSoC_4_BLE_CapSense_Proximity module (powered separately) goes from flashing to off which according to both sets of documentation indicates both are connected. As a test I reset (button) the PSoC_4_BLE_CapSense_Proximity module after they were connected and observed the blue LED on the PSoC_4_BLE_Central_IAS Pioneer board go out. Also tried both connHandle and cyBle_connHandle in the function argument with the same results. Really appreciate your help and patience. Will continue to investigate. Sent from Mail for Windows 10
|
|
|
|
hongqiaolian 发表于 2019-1-2 20:36 你发现设备上的服务/特性了吗?可能是你想先发现吗?(这不应该是理论上的要求) CyByLyCon句柄应在CyLyLyEvtGATHEXCONTCONTIGIN事件发生后初始化为正确的值。 可能会尝试设置一个小的连接后,看看你只是尝试它太快?在启用启用通知之前,需要完成BLE连接过程的不同事件。 以上来自于百度翻译 以下为原文 Have you discovered the services/characteristics on the device yet? It could be it wants you to discover first? (This shouldn't be a requirement in theory) cyBle_connHandle should be initialized to the correct value after the CYBLE_EVT_GATT_CONNECT_IND event occurs. Possibly try settings a small timer after connection to see if you are just attempting it too soon? There could be a different event for the BLE connection process that needs to finish before setting the notification enabled. |
|
|
|
yuhe82 发表于 2019-1-2 20:50 我是从PSoCoS4BLyCuthalLayIAS示例中工作的,它看起来像是一个发现。我移动到我试图在发现调用函数之后启用通知的地方。在我最初打电话的地方也设置一个计时器。这些API函数的调用在哪里重要?我把它们放在主体中。C他们应该进入Apple Enthand()吗? 从Windows 10发送邮件 59592D93076EA218D907CbAA52Be.PNG 148字节 以上来自于百度翻译 以下为原文 I am working from the PSoC_4_BLE_Central_IAS example and it does look like it does a discovery. I moved where I am trying to enable notifications to after the discovery call function. Also set a timer before where I originally had the call. Does it matter where the call to these API functions go? I am putting them in main.c should they go in the ApplicationEventHandler() instead? Sent from Mail for Windows 10
|
|
|
|
hongqiaolian 发表于 2019-1-2 21:08 你应该能够从主C调用BLE函数完全正确。 要清楚的是:您正试图使用通知功能从外围设备向客户端设备发送通知,但是您希望客户端首先在外围设备上向CCDCD发送启用通知值。 既然您使用的是PSoCux4BuleCyralSub IAS,为什么不等到发送标志DeVeCeCnEntrueTo变成真正的发送通知启用写特性请求之前? 为“未启用通知”创建标志,然后在尝试写入通知后将其设置为true,并只调用基于标记为true的通知特性在主写中写入。前任: 如果(通知不成立) { //向远程设备发送通知特性/使能值 当接收到设备连接的事件或发现完成后,未启用通知时,将通知设置为true;或者,将整个检查放在if(DeViCeNeNECT){} if语句中。 } 也许,试着从BalError创建一个定制的中央设备,并设置它来启用通知/写连接上的值。这样,您就可以验证它不是用API调用的方式,而是用应用程序的整体方式来为您使用的IAS示例进行操作。 以上来自于百度翻译 以下为原文 You should be able to call the BLE functions from main.c perfectly fine. Just to be clear: You are trying to send a notification from the peripheral to the client device using the notification function, but you want the client to send an enable-notification value to the CCCD on the peripheral first. Since you are using the PSoC_4_BLE_Central_IAS, why not wait until the flag deviceConnected becomes true before sending the notification enable write characteristic request? Create a flag for "notifications not enabled", then set it to true after you attempt to write the notifications, and just call the notification characteristic write in main based on the flag being true. Ex: if(notificationsNotEnabled) { SendNotification(); //send the notification characteristic/enable value to the remote device notificationsNotEnabled = false; //set this to true when you receive the device connected event or after discovery is complete and notifications are not enabled? Or, put this entire check inside of the if(deviceConnected){} if statement. } Perhaps, try creating a custom central device from barebones and set it up to enable the notifications/write the value on connection? That way you can verify it is not something with the way you are calling the API, but rather something with the way the application overall is behaving for the IAS example you are using. |
|
|
|
yuhe82 发表于 2019-1-2 21:18 要清楚的是:您正试图使用通知功能从外围设备向客户端设备发送通知,但是您希望客户端首先在外围设备上向CCDCD发送启用通知值。 是的,但这只是因为我理解客户机和服务器之间的握手。如果我能在服务器端直接启用通知,那么它也可以工作。我只需要服务器来流数据。 既然您使用的是PSoCux4BuleCyralSub IAS,为什么不等到发送标志DeVeCeCnEntrueTo变成真正的发送通知启用写特性请求之前? 准确地说。我在结束时做: 如果(外设发现) { 与受体相连。 /*复位标志以防止重新发送连接命令*/ 发现错误; 我把启用通知放在这里。 } 因为我认为这将是在设备连接后,我可以使用外围设备标志来按照您的建议行动。 但我也尝试过: 如果(DeCIEC) { 在这里。 } 正如你所建议的,确保连接已经完成。但我还是犯了那个错误。因为我没有按照你的建议去执行国旗,所以一直被叫来。我同意这可能是更好的地方。我会把它移回这里并添加看起来更干净的标志。 现在我正在尝试验证Cn句柄是否有正确的值。 从Windows 10发送邮件 0785 CF40B8047 D8A53EC42FB412164E.PNG 148字节 以上来自于百度翻译 以下为原文 Just to be clear: You are trying to send a notification from the peripheral to the client device using the notification function, but you want the client to send an enable-notification value to the CCCD on the peripheral first. Yes, but only because that was my understanding of the handshake between client and server. If I can enable notifications directly at the server side that would work as well. I just need the server to stream data. Since you are using the PSoC_4_BLE_Central_IAS, why not wait until the flag deviceConnected becomes true before sending the notification enable write characteristic request? Precisely. I was doing at the end of: if(peripheralFound) { Connect to pheripheral. /* Reset flag to prevent resending the Connect command */ peripheralFound = FALSE; I put the enable notifications here. } Because I thought that would be after the devices had connected and I could use the peripheralFound flag to act as you suggest. But I also tried it in: if(deviceConnected) { In here. } As you suggested insure the connection had been made. But I still got that error. It was being called continuously there though because I had not implemented the flag as you suggest. I agree that would probably be the better place for it. I will move it back to here and add the flag as that seems cleaner. Right now I am trying to verify that the connHandle has the correct value. Sent from Mail for Windows 10
|
|
|
|
如果您可以通过调试器实时查看Cal句柄值,这将是有用的; 您应该能够在TopDebug .CysCH页面上为BLE组件下的通知启用设置默认值: 嗯,我刚刚意识到我自己的代码在调用BLE API时使用的值CyByLyCon HealthLe.bD句柄来引用设备。请尝试查看Cn句柄数据结构,并查看是否需要通过CONNANDIL.BDHORD成员而不是CONNATHER数据结构。 以上来自于百度翻译 以下为原文 If you can watch the connHandle value in real time with a debugger, that would be useful to see; You should be able to set the default value for the notification enable under the BLE component at the TopDesign.cysch page: Hmm, I just realized that my own code is using the value cyBle_connHandle.bdHandle for the reference to the device when calling the BLE apis. Try looking at the connHandle data structure and see if you need to pass the connHandle.bdHandle member rather than the connHandle data structure. |
|
|
|
yuhe82 发表于 2019-1-2 21:42 我做了我们所讨论的,并将通知启用代码移到了我一直在使用的pSOCK44BLYCITALALIAIAS代码示例中的IF(DeViCeNEnEnter)部分中,并添加了您建议的标志。APIREST现在是CyByyReloRoSoK(是的!!!!)现在回到实际读取通知数据。我还使用UARTHYToBuleCub中心示例作为参考,并注意到它们在调用回函数中放置了CyByLyEvtGATCK-HealLeValueNTF“case”来读取通知数据,因此我在IAS实例中添加了相同的case语句到ApvestEvEnthand()。这是一个通知事件,这个案例应该被激活。然而,它似乎从来没有得到这样的情况下(我有一个UART链接到PC进行调试,并在这种情况下打印声明)。 我还回去尝试CyByLyCon句柄而不是CONNACKE,您刚才提到的是相同的结果,它也给出了CyByLyRrOrthOK的API结果,在发送命令以启用通知之后,但不停止在上面提到的case语句中。我必须承认,我不知道句柄成员与数据结构之间的区别,但我假设通知在任何事件中都被启用。我可以回去,并设置通知作为默认的外围设备方面,你也建议。 这是有意义的,我应该只读取通知数据时,一个新的价值已经检测到在中央的一面。只是不确定为什么它没有看到那个“病例”。 一如既往地感谢您持续的耐心和建议。 从Windows 10发送邮件 3B1FAFF91245BB6E4791ABA548 E8PNG 148字节 以上来自于百度翻译 以下为原文 I did what we discussed and moved the notification enable code to the if(deviceConnected) section of main in the PSoC_4_BLE_Central_IAS code example I have been working with and added the flag you suggested. The apiResult is now CYBLE_ERROR_OK (yes!!!). So now back to actually reading the notification data. I am also using the UART_to_BLE_central example for reference and notice they put a CYBLE_EVT_GATTC_HANDLE_VALUE_NTF “case” in the call back function to read the notification data so I added the same case statement to ApplicationEventHandler() in my IAS example assuming when the central receives a notification event this case should be activated. However it never seems to get to that case ( I have a uart link to the PC for debugging and put a print statement in that case). I also went back and tried the cyBle_connHandle instead of connHandle you were just mentioning with the same results, it also gives an apiResult of CYBLE_ERROR_OK after sending the command to enable notifications but does not stop at the above mentioned case statement. I must admit I don’t know the difference between the handle member vs data structure but I am assuming the notification is being enabled in any event now. I can go back and set notifications enabled as the default on the peripheral side as you suggest as well. It kind of makes sense I should only read the notification data when a new value has been detected at the central side. Just not sure why it is not seeing that “case”. As always thank you for your continued patience and suggestions. Sent from Mail for Windows 10
|
|
|
|
yuhe82 发表于 2019-1-2 21:42 您应该能够在TopDebug .CysCH页面上为BLE组件下的通知启用设置默认值: 我在外围方面做了这件事,设置了在BLE组件中启用CAPSENSE特性的通知,然后作为与CyScript连接的测试,并读取CCDC,但是它是与默认情况下没有启用通知时相同的0:00,而如果TH是默认的,则不是预期的01:00。E违约事实上已经改变了。我不得不在CyScript中再次手动写入CCDC以开始接收数据。 同样的结果在中心端,它连接,说它启用了通知,但是在CyByLyEvtGATCcHAdLeLoValueNtf: 同时有一个问题:你需要什么时候调用CyByPurialPythEngEnter()?我看到在例子中的不同地方被调用。 从Windows 10发送邮件 50FB14763369FEAC46A73F7E21FE4.PNG 148字节 以上来自于百度翻译 以下为原文 You should be able to set the default value for the notification enable under the BLE component at the TopDesign.cysch page: I did this on the peripheral side, set notifications for the CapSense characteristic to be enabled in the BLE component but then as a test connected with CySmart and read the CCCD but it was 00:00 same as when notifications were not enabled by default and not 01:00 which I would have expected if the default was in fact changed. I had to manually write to the CCCD again in CySmart to start receiving the data. Same result at the central side, it connects, says it enabled notifications okay but never stops at case CYBLE_EVT_GATTC_HANDLE_VALUE_NTF: in the ApplicationEventHandler(). Did have a question in the meantime: When do you need to call Cyble_Process_Events()? I see that being called at various places in the examples. Sent from Mail for Windows 10
|
|
|
|
hongqiaolian 发表于 2019-1-2 21:58 哎呀!CyBelyErrRoSook总是一个好兆头! CyByLyPrimultEvsServer()将基本处理任何未决的BLE事件;理想情况下,当您运行主代码循环时,应该执行此操作。这需要一些时间,取决于发生了多少事件,但是如果没有等待的话,它会返回,这样你就不用担心如果没有改变,它会阻塞。在API API调用之后,示例会调用它以确保API调用是在ASAP上执行的。CyByLyPrimultEngices()最终是BLE无线电的来源,是异步的,用于从代码的其余部分进行操作。 通知事件在IAS事件处理程序中不起作用,因为IAS事件处理程序只处理为IAS特性、服务和相关事件指定的事件。因此,由于您正在对自定义特性进行通知,所以我将尝试将通知事件处理程序放入回传给CyByListSistar()函数中的回调中,而不是IAS事件处理程序。 我必须承认,我不知道句柄成员与数据结构之间的区别,但我假设通知在任何事件中都被启用。我可以回去,并设置通知作为默认的外围设备,正如你建议。我这样做的外围方面,设置通知的CAPSENSE特性,使能在BLE组件,但然后作为测试连接CyScript和读取CCDCD,但它是00:00与默认情况下没有启用通知的情况相同,如果默认情况下更改为01:00,我将预期这是相同的。我不得不在CyScript中再次手动写入CCDC,开始接收数据。这很奇怪,也许您启用了错误的CCDC?另外,我不知道CnCurror和CnDeNo.BD句柄之间的区别是什么,但是这是我们的程序之间的一个区别,所以我想提一下。我希望它自己的CONNATHER工作:/可能双重检查你正在通过正确的变量类型:指针对直接对象,等等。 对于外围代码,您可以很容易地通过测试通知开始工作,忽略忽略启用通知并只发送通知。然后,一旦您有可靠的工作,返回并实现通知启用代码,以防止从应用程序/用户角度的虚假通知。 以上来自于百度翻译 以下为原文 Yay! CYBLE_ERROR_OK is always a good sign! The Cyble_Process_Events() will basically process any pending BLE events; Ideally, you should be running through this when you run through your main code loop. It will take some time depending on how many events happened, but it will return if none are pending, thus saving you having to worry about it blocking if nothing changed. Examples tend to call it after a BLE API call to ensure the API call is acted upon asap. The Cyble_Process_Events() is ultimately the source of the BLE radio being "asynchronous" for operation from the rest of your code. The Notification Event will not work in the IAS event handler, as the IAS event handler ONLY handles the events designated for IAS characteristics, services, and related events to those. Thus, since you are doing a notification on a custom characteristic, I would try putting the notification event handler inside of the callback that you pass to the Cyble_start() function, rather than the IAS event handler. I must admit I don’t know the difference between the handle member vs data structure but I am assuming the notification is being enabled in any event now. I can go back and set notifications enabled as the default on the peripheral side as you suggest as well. I did this on the peripheral side, set notifications for the CapSense characteristic to be enabled in the BLE component but then as a test connected with CySmart and read the CCCD but it was 00:00 same as when notifications were not enabled by default and not 01:00 which I would have expected if the default was in fact changed. I had to manually write to the CCCD again in CySmart to start receiving the data.That is odd; perhaps you are enabling the wrong CCCD? Also, I'm not sure what the difference between the connHandle and the connHandle.BdHandle are, but that was one difference between our programs, so I thought to mention it. I would expect the connHandle on it's own to work :/ Possibly double check that you are passing the correct variable type: pointer vs direct object, etc. For the peripheral code, you can easily start by testing the notifications are working first by ignoring checking the notifications are enabled and just sending the notifications regardless. Then, once you have it reliably working to go back and implement the notification enable code to prevent spurious notifications from the application/user perspective. |
|
|
|
我不假装了解任何这一切,我只是看足够的例子,得到更多的先进用户,如你自己的帮助,但我现在收到通知。也许它还没有工作,我只是做了一些使它工作的巧合,但是问题似乎是WrreRealQPARAM的定义,它是API调用的参数来启用通知。看看BulthtoTuuAuthCull的例子,我看到他们这样定义: const uTn8 EnabeloPosiCurialPARAM〔2〕={0x01,0x00 }; /*要传递给启用通知请求*/*结构* CyBLY-GATCKReWiReGeReqEnEnabLeNoTrimeCuthOrthRealErqPARAM= { {(Unt8*)EnabnLogoPiTrimePARAM,2, 2 }, 零 }; 这似乎已经奏效了。 我在第一篇文章中提到,我取出了IAS中心示例中使用的FIDME配置文件,只复制了来自外围侧的自定义配置文件。也确保了UUID的匹配。我不知道我是否需要复制Copsices定制服务在中间的一面。还取出所有对IAS函数的引用。 所以,是的,通知事件处理程序位于回传给CyByListSistar()函数的内部。 我仍然感到困惑,为什么启用外围设备BLE组件上的CAPSENSE特性的通知似乎什么都不做。我仍然必须启用客户端的通知。如果Box被设置为默认启用,我认为应该自动发送通知。 还有很多我不理解,像在外围方面(CasSooSimulink例子),我想消除用户需要按下一个按钮从睡眠中醒来并开始广告,但是当我评论低功耗模式定义时,它从复位开始广告,但不会发送N。ootuts,LOL。 不管怎样,你帮了我很大的忙,非常感谢。 从Windows 10发送邮件 9313574056148F58903B6FC0A2622C0.PNG 148字节 以上来自于百度翻译 以下为原文 I don’t pretend to understand any of this, I just look at enough examples and get help from more advanced users like yourself but I am receiving notifications now. Maybe it is still not suppose to work and I just did something that made it work by coincidence but the problem seemed to be the definition of writeReqParam that was the argument to the API call to enable notifications. Looking at the BLE_to_UART_central example I saw they defined it like this: const uint8 enableNotificationParam[2] = {0x01, 0x00}; /* structure to be passed for the enable notification request */ CYBLE_GATTC_WRITE_REQ_T enableNotification_writeReqParam = { {(uint8*)enableNotificationParam, 2, 2}, 0 }; That seemed to have done the trick. Think I mentioned in the first post I took out the FindMe profile used in the IAS central example and just duplicated the custom profile from the peripheral side. Also made sure the UUID’s matched. I don’t know if I had to duplicate the CapSence custom service on the central side though. Also took out all references to any IAS functions. So yes the notification event handler is inside of the callback that is passed to the Cyble_start() function. I am still puzzled why enabling notifications on the CapSense characteristic on the peripheral side BLE component didn’t seem to do anything. I still had to enable notifications from the client side. I thought notifications should automatically be sent if box is set to enable them by default. Still A LOT I don’t understand, like on the peripheral side (CapSense Proximity Example) I want to eliminate the need for the user to press a button to wake from sleep and start advertising but when I comment the low power mode #define out, it starts advertising from reset but then won’t send notifications, lol. Anyway you’ve been a tremendous help, thank you very much. Sent from Mail for Windows 10
|
|
|
|
只有小组成员才能发言,加入小组>>
754个成员聚集在这个小组
加入小组2105 浏览 1 评论
1851 浏览 1 评论
3669 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
1786 浏览 6 评论
1536 浏览 1 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
569浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
423浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
437浏览 2评论
383浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
915浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 14:33 , Processed in 1.463267 second(s), Total 70, Slave 64 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号