node-tsapi

高德Web服务API V3/V5 对比:地理编码、搜索与电子围栏的3种集成方案 本文详细对比了高德地图Web服务API V3与V5版本的核心功能差异,包括地理编码、搜索精度和电子围栏等关键特性,并提供了三种集成方案。针对不同业务场景,给出了版本选型建议和配额优化策略,帮助开发者高效构建地理围栏应用。 阅读详情
希望能够打造一个node.js平台上的tsapi运行环境。构建node_tsapi的目的是让node平台上也可以运行tsapi应用。用途之一是构建一个可以替代lcs的应用。node平台上支持web socket等下一代web标准,这让提供更便利更满足标准的实时监控系统成为可能。现在的监控系统实现方式是让浏览器不断地发送请求以便获得更新后的数据。这种实现方式对系统的压力很大,不是保持长连接状态而是不断地创建新连接然后立刻又关闭。同时,也让开发一个完全运行在网页内的软电话成为可能。用途之二是lcs的所有其他代码均可以用javascript来实现。node平台提供与很多优秀平台的接口库,这让编写一个利用新技术新框架的软件变得更加便捷。javascript语言的解释性特性让部署和发布新功能变得快速。还可以畅想的是,负载均衡、双机热备等高级特性。之前决定的目标有些大,现在决定降低要求减少需求。希望这个node_tsapi只是个底层运行框架。其实就是将tsapi提供的功能再做一层转换,让node下的应用也可以使用tsapi。



addonA。node里所有都是异步方式的,这样才能最大可能发挥node的优势。tsapi也是异步的,发出一个请求,稍后才收到请求的响应。如果要将二者整合,貌似tsapi非常适合node的环境。但其实一个tsapi请求也会是阻塞方式的。一个tsapi请求底层就是发送一个tcp包。我们知道发送tcp包是阻塞模式的,除非已到达对端,否则发送函数不会返回。如此的话,调用tsapi请求也将在工作线程内执行。获取响应数据或者AES主动发来的数据可以采用单独一个线程来做。我们假想这么一个场景。一个make call请求来到node,node解析后将其交给addonA来处理。addonA发起一个异步的cstaMakeCall请求。工作线程将调用cstaMakeCall请求,如果函数返回失败,调用回调函数。此时,addonA内不删除请求对象baton。待响应消息到来时,再调用回调函数。感觉tsapi的编程模型很匹配node。

创建addonA时,可以传入连接AES的参数信息。调用addonA.Open(function(){}),传入回调函数。再调用addonA.MakeCall(function(){}),传入回调函数。应该在Open的回调函数中判断成功了调用addonA.MakeCall。这个使用场景需要后台有一个强健的运行逻辑来支撑。Open成功不仅仅只是成功打开了流通道,还生成了一个后台线程用来收取事件或响应数据。我觉得收取acsOpenStream的确认响应消息也可以通过这个后台线程来做。为了与后台收tsapi数据线程配合,后台工作线程,即调用实际csta函数的线程将会在事件来到后再返回,也就是说如果事件没到,后台工作线程将一直阻塞。主线程只有一个,也就是说接收请求以及生成请求的只有一个线程。main线程生成的请求将交给worker线程处理。我们假定只有一个worker线程。还有一个back线程,它的作用是收取tsapi数据。当一个请求被生成后,worker线程执行。addonA提供一个接口GetEvent,由js脚本中的setInterval定时调用。setInterval内的回调函数会调用addonA的GetEvent接口。这样做有用吗?GetEvent将收到的事件放入队列中,也包括响应事件。我们再回到之前的那个场景中。主线程内调用了一个csta函数,实际是在worker线程内被调用。在主线程内会调用发起这个请求的回调函数,此时回调函数被调用其实请求还不知道是否真的执行成功,因为消息将在GetEvent函数内才能取到。在addonA对象内将此请求放入队列,并保存请求的invokeID值。当主线程调用GetEvent时,如果是个confirmation事件,则查找队列看是否有invokeid值相同的请求。如果有,则处理事件,调用请求的回调函数。setInterval会调用getEvent,使用uv_queue_work会在worker线程内执行acsGetEventPoll函数。尽可能多的取数据。然后addonA中有一个函数会在主线程内被调用。

main thread:getEvent(js) - addonA.getEvent(js) - addonA.GetEvent(c) - addonA.Work_BeginGetEvent(c)
worker thread:addonA.Work_GetEvent(c)
main thread:addonA.Work_AfterGetEvent(c) - getEventCallback(js)

首次实现的addonA将采用这样的方式:js代码内启动一个interval,每隔十毫秒调用一次addonA的getEvent函数。如此就可解决收取事件的问题,不会延误处理事件的时机。




我在想一个问题。就是基于WEB的CTI到底应该是什么样的?页面内建立一个web socket连接。




我们是否应该在Work_AfterOpen函数内调用acsGetEventBlock这个阻塞式的函数。我们在讨论这个前,先回到js代码中如何打开与AES的连接开始。传入参数,调用open接口,传入的还有回调函数。回调函数将告诉应用方打开是否成功。如果失败了,我们如何重连。使用setTimeout?这是个选择。如果成功了,可以开始监视设备。好,这就是使用场景。再回到Work_AfterOpen函数,这个函数将会在主线程内执行。acsGetEventBlock是个阻塞式的函数,也就意味着此时主线程将不能处理其他请求。最理想的实现就是不要使用这个阻塞函数。那么我们就使用acsGetEventPoll函数。但如果这个函数取不到事件呢?取不到事件的情况是网络由延迟,或者对方某种原因无法回送消息。也就是说立即调用acsGetEventPoll是可能取不到数据的。如果这样的话,那么就不知道是否以打开成功。其实我们可以这么做,当第一次调用acsGetEventPoll时,如无任何数据则再次将此请求放入工作队列,并记录已被调用次数。如果有数据但不是我们需要的那个数据则立即回调函数通知已失败。或者在超过获取数据的上限时仍没收到则回调通知已失败。只有在未超过获取数据上限前收到需要的数据才能通知应用已成功。这样的话,打开流通道是个非阻塞方式的过程。打开流通道成功后,可以打开取数据的定时器。

main thread:makeCall(js) - addonA.makeCall(js) - addonA.MakeCall(c) - addonA.Work_BeginMakeCall(c)
worker thread:addonA.Work_MakeCall(c)
main thread:addonA.Work_AfterMakeCall(c)
在上述描述过程中的最后一步,Work_AfterMakeCall(c)。在这里已经是主线程了,但不能回调函数通知应用。因为我们还需要获取响应消息才能回调函数。那么此时,应该将MakeCallBaton放入一个需要等待响应消息的队列中。同时放入队列的还有调用cstaMakeCall返回的InvokeID_t值。我们将在每次取事件的最后一步Work_AfterGetEvent中处理这个队列。首先检查当前这些数据(我们可能处理多于一个的消息,如果我们能取到的话)是否就是响应消息,并通过响应消息中的InvokeID_t值,查找队列中是否有InvokeID_t值相同的Baton对象。如果有,将响应消息中的成功或失败消息通过回调通知应用。再说点题外话,Work_AfterGetEvent函数的另一个作用就是检查对列中的请求是否超过了规定的等待上限,如果是则回调函数通知应用请求已超时,也就是失败了。这是一个典型的单请求单响应的处理模型。TSAPI还有一些单请求多响应的场景。

对于单请求多响应的模式,上述处理模型仍然使用。首先,在创建XXXBaton时,我们已经知道它是否是一个单请求多响应模式的请求。可以为他赋上一个值指明模式类型。在收到第一个响应消息时,不回调函数,而是继续等待。每次在收到又一个消息时,重置超时。直到收到最后一个消息才回调函数。
使用ts-node直接运行ts项目 这里指的是整个项目使用ts写,不进行编译,直接运行 index.js require('ts-node/register'); require('./server');先使用ts-node/register进行注册,然后直接运行server.ts脚本 阅读详情

相关推荐

基于TSAPI协议的CTI通信客户端软件设计与实现

国防科技大的一个硕士论文,讲解一个基于TSAPI协议的CTI通信客户端软件设计与实现文章,很详细,新手可以看看了解TSAPI的开发方案

avaya交换机TSAPI接口开发Demo 查看源码: cstadefs.h

cstadefs.h:源码内容

编程岁月 3038

tsapi开发文档

Avaya tasapi 接口开发文档

基于libuv框架改造pangu - (二) 修改启动过程

在多线程环境下开始接口是这样实现的。在打开流通道前已经设置好了连接参数,以及将要在打开流通道后监视的设备列表,这是第一步。第二步是创建三个线程,pangu的三个静态函数分别是这三个线程的入口函数。然后再调用开始接口。开始接口只是触发启动事件对象,这个事件对象用来唤醒三个线程中其中一个线程。这个被唤醒的线程将执行打开流通道,以及监视大量设备。 首先是调用打开流通道接口。这是个同步调用,即阻塞式。然

Neohan的专栏 1547

avaya的tsapi开发资料

avaya的tsapi开发资料,非常有用

hcaptcha逆向实战:从API解析到参数构造的完整链路

本文详细拆解了hcaptcha验证码的逆向实战流程,从环境准备、捕获API与版本号,到解析核心加密逻辑hsw.js,再到构造getcaptcha请求参数,最后完成验证提交。文章重点剖析了motionData、n、c等关键参数的获取与构造方法,为开发者模拟浏览器行为、实现自动化验证提供了清晰的完整链路指南。

ik678901的博客 629

STM32平台中ARM架构向量表配置:手把手教程

深入讲解STM32平台下arm架构的向量表配置方法,结合实际操作步骤,帮助开发者掌握中断向量的定位与初始化,提升嵌入式系统开发效率。

weixin_42514540的博客 800

基于libuv框架改造pangu - 序

概述 在考察是否可以基于node开发下一代CTI平台时,我突然想到是否可以在现阶段修改pangu使其基于libuv。在研究如何使用node实现CTI时,因为必须满足node的事件驱动以及异步特性,所以用到了大量的异步模式。因为二者非常匹配,我指的是node和TSAPI,所以实现方式非常舒适。我又想到之前实现pangu时,尤其实现单请求多响应模型时非常难受。所谓的node和tsapi很匹配,倒不如

Neohan的专栏 1569

别再只盯着DDR5了!聊聊3D DRAM:它凭什么能解决AI算力的内存墙难题?

本文深入探讨了3D DRAM技术如何突破AI算力的内存墙限制。通过立体堆叠架构,3D DRAM在存储密度、带宽和延迟方面实现显著提升,有效解决AI训练和推理中的内存瓶颈问题。文章还分析了三星、SK海力士等巨头的技术路线图,并指出商业化面临的挑战与机遇。

weixin_42685438的博客 188

无线控制的隐形桥梁:深入解析NRF24L01在电机控制中的数据传输艺术

本文深入解析NRF24L01无线模块在电机控制中的数据传输技术,涵盖通信机制优化、抗干扰策略及实时性保障。通过舵机和无刷电机的实战案例,展示如何构建稳定高效的无线控制系统,为嵌入式开发提供完整解决方案。

j7k8l的博客 332

使用typescript和egret wing3开发简单的单机五子棋游戏

前几天学了微软开发的Typescript,这种语言是用面向对象的思想来写,自动转换为js代码,既然学了就用一下,配合egret引擎(基于Html5的开发引擎)及egret wing3做一个十分基本的小游戏练下手,毕竟我也只是一个开发后端的实习生,给一些新手参考一下,有错误和建议可以提出来,谢谢。 基本的链接: Ts下载及API:https://www.tslang.cn/ 。 egret引擎及egr

3726

OSNet代码解析(普通卷积,分组卷积,深度可分离卷积,OSblock组成)

文章目录普通卷积和分组卷积普通卷积和深度可分离卷积用深度可分离卷积(LightConv3x3)代替普通卷积(Conv3x3)减少参数OSBlock (bottleneck)OSNet OSNet之所以轻量(2.2M)在于网络浅,使用深度可分离卷积代替传统卷积,但是很有效 普通卷积和分组卷积 所谓分组卷积,就是右图的input features分成一组一组,如上图groups=3,那么输入的特征分成3组,每组有12/3=4的通道的特征参与输出。然后根据输出通道的维度,得到每组的输入特征要计算两次(6/3=2

Mr_DaYang的博客 9800

HarmonyOS ArkTS与C++数据类型转换

HarmonyOS的主力开发语言是ArkTS,也提供了C++语言的支持,对于一些能力,比如音视频编解码等,HarmonyOS 提供的也只有C++ API,对于一些其他平台现有能力的迁移,C++也是最快捷高效的,所以对于一个HarmonyOS 开发者,掌握ArkTS与C++交互成了一项必备技能。&emsp每种编程语言都有自己定义的数据类型,不同编程语言之间互相调用就涉及到了数据类型的转换,ArkTS与C++的转换主要有Node-API接口提供,本文介绍ArkTS与C++互相转换的接口和最佳实践。

qq_36158551的博客 1622

使用Python实现深度学习模型:智能极端天气事件预测

在本项目中,我们成功利用Python和Keras库构建了一个基于LSTM的极端天气预测模型。通过时间序列数据,模型能够识别天气趋势并预测未来的极端天气事件。尽管这是一个简化的示例,但它为实际应用中如何利用深度学习进行天气预测提供了一个很好的基础。随着更精确的数据和更多的特征信息,类似的模型可以进一步扩展到其他极端事件预测上,如风暴预警、气象灾害评估等。

Echo_Wish 730

Python 爬虫进阶技巧:新手必学的反爬突破与效率优化

本文系统总结了爬虫进阶的核心技巧,针对新手常见的反爬拦截、效率低下、动态页面解析等痛点问题,提出了可落地的解决方案。主要内容包括:通过随机UA池、代理IP池和Cookie池突破常见反爬机制;利用多线程/异步请求提升爬取效率;使用Selenium解析动态渲染页面;以及数据清洗方法提升数据质量。文中提供了完整的代码示例和实战对比数据,并强调爬虫开发应遵守合规性要求。这些技巧能帮助开发者快速提升爬虫实战能力,应对80%以上的常见爬取需求。

2503_91057718的博客 1435

TypeScript: 使用ts-node加速开发

普通的运行ts的方式, 需要先通过tsc编译为js文件然后运行node xx.js: 一共花了2条命令,使用繁琐: 而使用ts-node: npm install -g ts-node 只需要ts-node xxxx.ts即可: ...

手写我对你的温柔 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

axios请求失败,如何获取接口返回的状态码及错误信息

如果axios请求失败,如何获取接口返回的状态码及错误信息? 方法如下 axios.get('api/test') .catch(function (error) { if (error.response) { // The request was made and the server responded with a status code // that falls out of the range of 2xx console.log(error.re

pinbolei的博客 9062

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

API接口测试(菜鸟之路)

引言: 不知不觉中成为一名测试攻城狮已将近7年之久,在这期间做过不少API接口测试。 最早接触的API接口在项目中称之为(webservice),期间走了不少弯路。也收获了不少的经验,现分享下在测试的路上走过的坑。 第一阶段小白初体验: 初始接触API是在11年,第一次接触API接口一脸的懵逼,很茫然不知如何下手测试,对http网络协议也不了解。后来 由研发同学提供对应...

weixin_30822451的博客 3670

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RestTemple调用第三方API接口报错抛出异常无法返回API接口错误信息Message

最近遇到一个棘手的问题,有个需求需要写一些调用外部API接口的方法,因为没有SDK,所以我只能手动的去调用,框架采用的是springboot,Java语言编写,但是却出现了当调用异常,包括参数错误,token无效等直接抛出异常400,并没有获取到API接口的异常信息,只有我们自己抛出的异常信息。这样接口的调用方肯定不知道接口调用异常原因。 一、RestTemple实现API调用 我采用的使用springboot的restTemple来去调用接口,具体的实现是先定义一个controller接口,然后再在s

weixin_42736075的博客 6956

node-sqlite3源码分析 - Database::run方法

以下是lib/sqlite3.js文件内的一段:Database.prototype.run = function(sql) { var params = Array.prototype.slice.call(arguments, 1); var statement = new Statement(this, sql, errorCallback(params)); sta

Neohan的专栏 4188
上一篇: 基于libuv框架改造pangu - (一) 删除显式同步
下一篇: 基于libuv框架改造pangu - (二) 修改启动过程
Neohan
博客等级 码龄26年 33粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值