123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642 |
- #include "Expel.hpp"
- #include "Shell.h"
- namespace gsd
- {
- class ExpelClient: public TcpClient {
- public:
- int id = 0;
- bool flag = false;
- typedef std::shared_ptr<ExpelClient> Ptr;
- ExpelClient():TcpClient() {
- }
- ~ExpelClient(){
- }
- /**
- * @description: setDeviceControl
- * @param {shared_ptr<deviceBase>} DeviceControl
- * @return {*}
- */
- void setDeviceControl(std::shared_ptr<ContorlGear> DeviceControl){
- this->deviceControl = DeviceControl;
- }
- /**
- * @description: setSendBuf
- * @param {Ptr} Buffer
- * @return {*}
- */
- void setSendBuf(const BufferRaw::Ptr Buffer){
- buffer = Buffer;
- }
- protected:
- virtual void onConnect(const SockException &ex) override{
- //连接结果事件
- if(buffer != nullptr) this->send(buffer);
- }
- virtual void onRecv(const Buffer::Ptr &pBuf) override{
- int msg = 0;
- if(this->deviceControl == nullptr) return;
- if(this->deviceControl->Consumer((uint8_t *)pBuf->data(), (int)pBuf->size(), msg)){
- flag = true;
- if(config::getPtr()->debug) DebugL << "deviceId[" << deviceControl->getDeviceId() << "] Device response is succeed" << endl;
- if(config::getPtr()->debug) DebugL << "REV:" << Expel::bytesToHexString((uint8_t *)pBuf->data(), (int)pBuf->size()) << endl;
- std::string json;
- SendDevice sendDevice;
- time_t timestamp;
- NettyClientResultMsg<SendDevice> nettyClientResultMsg;
- this->id = std::atoi(deviceControl->getDeviceId().c_str());
- if(deviceControl->getDeviceId() == "0") deviceControl->setDeviceId("3");
- deviceControl->BuildDeviceInfo(sendDevice);
- time(×tamp);
- sendDevice.msgTime = ctime(×tamp);
- std::string requestId;
- requestId = uuid::generate();
- nettyClientResultMsg.setRequestId(requestId);
- nettyClientResultMsg.setDataType(NettyClientCommandEnum().device_info);
- nettyClientResultMsg.setData(sendDevice);
- nettyClientResultMsg.objectToJson(json);
- if(config::getPtr()->debug) DebugL << json << endl;
- NoticeCenter::Instance().emitEvent(NOTICE_DEVICEINFO, requestId ,json);
- }
- }
- virtual void onFlush() override{
- //发送阻塞后,缓存清空事件
- DebugL;
- }
- virtual void onErr(const SockException &ex) override{
- //断开连接事件,一般是EOF
- WarnL << ex.what();
- flag = false;
- }
- virtual void onManager() override{
- static int num = 0;
- if(num < 5 ) {
- num++;
- return;
- }
- num = 0;
- if(!flag) return;
- std::string json;
- SendDevice sendDevice;
- time_t timestamp;
- NettyClientResultMsg<SendDevice> nettyClientResultMsg;
- if(this->id == 0) deviceControl->setDeviceId("3");
- deviceControl->BuildDeviceInfo(sendDevice);
- time(×tamp);
- sendDevice.msgTime = ctime(×tamp);
- std::string requestId;
- requestId = uuid::generate();
- nettyClientResultMsg.setRequestId(requestId);
- nettyClientResultMsg.setDataType(NettyClientCommandEnum().device_info);
- nettyClientResultMsg.setData(sendDevice);
- nettyClientResultMsg.objectToJson(json);
- NoticeCenter::Instance().emitEvent(NOTICE_DEVICEINFO, requestId ,json);
- }
- private:
- int _nTick = 0;
- std::shared_ptr<ContorlGear> deviceControl = nullptr;
- BufferRaw::Ptr buffer = nullptr;
- };
- /**
- * @description: 获取Ptr
- * @return {*}
- */
- std::shared_ptr<Expel> Expel::getPtr(){
- static shared_ptr<Expel> expel_ = nullptr;
- if(expel_ == nullptr) expel_= std::shared_ptr<Expel>(new Expel);
- return expel_;
- }
- /**
- * @description: HttpControler http的控制接口
- * @param {int} commandCode
- * @param {ExpelDevice} expelDevice
- * @return {*}
- */
- void Expel::HttpControler(int commandCode, ExpelDevice expelDevice){
- this->pool->async([this, commandCode, expelDevice](){
- ExpelDevice expel = expelDevice;
- switch (commandCode)
- {
- // 查询
- case 1:
- this->Status(expel);
- break;
- // 开启电源
- case 2:
- this->Open(expel);
- break;
- // 关闭电源
- case 3:
- this->Close(expel);
- break;
- // 开炮
- case 4:
- this->Fire(expel);
- break;
- default:
- break;
- }
- });
- this->pool->start();
- }
- /**
- * @description: sendDeviceMsgCallback
- * @param {NettyServerResultMsg<RecDeviceCommand>} &nettyServerResultMsg
- * @param {ExpelDevice} expelDevice
- * @return {*}
- */
- void Expel::sendDeviceMsgCallback(NettyServerResultMsg<RecDeviceCommand> &nettyServerResultMsg, ExpelDevice expelDevice){
- RecDeviceCommand recDeviceCommand;
- recDeviceCommand = nettyServerResultMsg.getData();
- std::string deviceId = to_string(recDeviceCommand.getDeviceId());
- int commandCode = atoi(recDeviceCommand.getCommandCode().c_str());
- switch (commandCode)
- {
- // 查询
- case 1:
- this->Status(expelDevice);
- break;
- // 开启电源
- case 2:
- this->Open(expelDevice);
- break;
- // 关闭电源
- case 3:
- this->Close(expelDevice);
- break;
- // 开炮
- case 4:
- this->Fire(expelDevice);
- break;
- case 18:
- this->Open(expelDevice);
- break;
- case 19:
- this->Close(expelDevice);
- break;
- default:
- break;
- }
- }
- /**
- * @description: 初始化
- * @return {*}
- */
- bool Expel::Init(){
- InfoL;
- return true;
- }
-
- /**
- * @description: 初始化
- * @return {*}
- */
- void Expel::Destroy(){
- InfoL;
- }
- /**
- * @description: 获取控制器
- * @param {*}
- * @return {*}
- */
- std::shared_ptr<ContorlGear> Expel::getControl(ExpelDevice& expelDevice){
- static std::shared_ptr<ContorlGear> deviceControl = nullptr;
- switch (expelDevice.deviceType)
- {
- case DeviceType::DevicePlayerV1:
- deviceControl = std::make_shared<DevicePlayerV1>();
- break;
- case DeviceType::DevicePlayerV2:
- deviceControl = std::make_shared<DevicePlayerV2>();
- break;
- case DeviceType::DeviceGasV1:
- deviceControl = std::make_shared<DeviceGasV1>();
- break;
-
- case DeviceType::DevicePlayerV3:
- deviceControl = std::make_shared<DevicePlayerV3>();
- std::dynamic_pointer_cast<DevicePlayerV3>(deviceControl)->setServerCname(expelDevice.ServerCname);
- std::dynamic_pointer_cast<DevicePlayerV3>(deviceControl)->setServerCpwd(expelDevice.ServerCpwd);
- std::dynamic_pointer_cast<DevicePlayerV3>(deviceControl)->setServerIP(expelDevice.ServerIp);
- break;
- case DeviceType::DevicePlayerV4:
- deviceControl = std::make_shared<DevicePlayerV4>();
- std::dynamic_pointer_cast<DevicePlayerV4>(deviceControl)->setServerIP(config::getPtr()->payServerIP);
- break;
- case DeviceType::DeviceGasV2:
- deviceControl = std::make_shared<gsd::DeviceGasV2>();
- break;
- case DeviceType::DevicePlayerV5:
- deviceControl = std::make_shared<gsd::DevicePlayerV5>();
- break;
- }
- deviceControl->setTypeId(expelDevice.deviceType);
- return deviceControl;
- }
- /**
- * @description: 打开设备
- * @param {int} deivceId
- * @return {*}
- */
- int32_t Expel::Open(ExpelDevice& expelDevice){
- std::shared_ptr<ContorlGear> deviceControl = nullptr;
- deviceControl = getControl(expelDevice);
- if(deviceControl == nullptr) return -1;
- uint8_t data[1024];
- memset(data, 0, sizeof(data));
- int length = 0;
- std::string deviceId = expelDevice.DeviceId;
- deviceControl->setDeviceId(deviceId);
- if(config::getPtr()->debug) InfoL << "DeviceId:" << deviceId << ", deviceType:" << expelDevice.deviceType << endl;
- // 获取指令
- if(deviceControl != nullptr && deviceControl->Open(deviceId, data, length) == 0){
- return Control(deviceControl, expelDevice, data, length, 2);
- }
- return -1;
- }
- /**
- * @description: 关闭设备
- * @param {int} deivceId
- * @return {*}
- */
- int32_t Expel::Close(ExpelDevice& expelDevice){
- std::shared_ptr<ContorlGear> deviceControl = nullptr;
- deviceControl = getControl(expelDevice);
- if(deviceControl == nullptr) return -1;
- uint8_t data[1024];
- memset(data, 0, sizeof(data));
- int length = 0;
- std::string deviceId = expelDevice.DeviceId;
- if(config::getPtr()->debug) InfoL << "DeviceId:" << deviceId << ", deviceType:" << expelDevice.deviceType << endl;
- // 获取指令
- if(deviceControl != nullptr && deviceControl->Close(deviceId, data, length) == 0){
- return Control(deviceControl, expelDevice, data, length, 3);
- }
- return -1;
- }
- /**
- * @description: 开火
- * @param {int} deivceId
- * @return {*}
- */
- int32_t Expel::Fire(ExpelDevice& expelDevice){
- std::shared_ptr<ContorlGear> deviceControl = nullptr;
- deviceControl = getControl(expelDevice);
- if(deviceControl == nullptr) return -1;
- uint8_t data[1024];
- memset(data, 0, sizeof(data));
- int length = 0;
- std::string deviceId = expelDevice.DeviceId;
- if(config::getPtr()->debug) InfoL << "DeviceId:" << deviceId << ", deviceType:" << expelDevice.deviceType << endl;
- // 获取指令
- if(deviceControl != nullptr && deviceControl->Fire(deviceId, data, length) == 0){
- return Control(deviceControl, expelDevice, data, length, 4);
- }
- return -1;
- }
-
- /**
- * @description: 状态
- * @param {int} deviceId
- * @param {string&} json
- * @return {*}
- */
- int32_t Expel::Status(ExpelDevice& expelDevice){
- std::shared_ptr<ContorlGear> deviceControl = nullptr;
- deviceControl = getControl(expelDevice);
- if(deviceControl == nullptr) return -1;
- uint8_t data[1024];
- memset(data, 0, sizeof(data));
- int length = 0;
- std::string deviceId = expelDevice.DeviceId;
- if(config::getPtr()->debug) InfoL << "DeviceId:" << deviceId << ", deviceType:" << expelDevice.deviceType << endl;
- // 获取指令
- if(deviceControl != nullptr && deviceControl->Status(deviceId, data, length) == 0){
- return Control(deviceControl, expelDevice, data, length, 1);
- }
- return -1;
- }
- /**
- * @description: 数组转换为16进制字符串
- * @param {uint8_t*} bytes
- * @param {int} length
- * @return {*}
- */
- std::string Expel::bytesToHexString(const uint8_t* bytes,const int length)
- {
- if (bytes == NULL) {
- return "";
- }
- std::string buff;
- const int len = length;
- for (int j = 0; j < len; j++) {
- int high = bytes[j]/16, low = bytes[j]%16;
- buff += (high<10) ? ('0' + high) : ('a' + high - 10);
- buff += (low<10) ? ('0' + low) : ('a' + low - 10);
- buff += " ";
- }
- return buff;
- }
- /**
- * @description: control
- * @param {*}
- * @return {*}
- */
- int32_t Expel::Control(std::shared_ptr<ContorlGear>& deviceControl, ExpelDevice& expelDevice, uint8_t* data, int& length, int type){
- static ExpelClient::Ptr client(new ExpelClient());
- std::lock_guard<mutex> gurad(m_mutex);
- deviceControl->setDeviceId(expelDevice.DeviceId);
- if(deviceControl->getDeviceTool() == ContorlGear::DeviceTools::serial){
- CSerialPort ser;
- config::Ptr m_config = config::getPtr();
- if(m_config->debug) DebugL << "Serial control data:" << bytesToHexString(data, length) << endl;
- ser.init(m_config->comPort.c_str());
- ser.setBaudRate(std::dynamic_pointer_cast<ContorlSerialBase>(deviceControl)->getBaudRate());
- if(!ser.open()){
- ErrorL << "Open port falied!";
- return -1;
- }
- if(ser.writeData((const char*)data, length) != length){
- WarnL << "Control command failed" << endl;
- return -1;
- }
- this->SerialReceive(ser, deviceControl);
- ser.close();
- return 0;
- }else if(deviceControl->getDeviceTool() == ContorlGear::DeviceTools::http){
- std::string serviceIP = "";
- if(deviceControl->getTypeId() == DeviceType::DeviceGasV2 || deviceControl->getTypeId() == DeviceType::DevicePlayerV3){
- serviceIP = config::getPtr()->payServerIP;
- }
- else{
- serviceIP = expelDevice.ServerIp;
- }
- if(serviceIP == ""){
- ErrorL << "The device IP address is empty" << endl;
- return -1;
- }
- httplib::Client cli(serviceIP, config::getPtr()->ExpelPort);
- std::string json;
- json = (char*)data;
- if(json != ""){
- DebugL << "Http control data:" << json << endl;
- }
- if(deviceControl->getTypeId() == DeviceType::DevicePlayerV3){
- if (auto res = cli.Post(std::dynamic_pointer_cast<DevicePlayerV3>(deviceControl)->getUrl().c_str(), json, "application/json")) {
- if (res->status == 200) {
- // DebugL << res->body << endl;
- return 0;
- }else {
- WarnL << res->body << endl;
- return -1;
- }
- } else {
- auto err = res.error();
- ErrorL << "HTTP Service unavailable:" << err << endl;
- return -1;
- }
- }else if(deviceControl->getTypeId() == DeviceType::DeviceGasV2){
- auto parms = std::dynamic_pointer_cast<DeviceGasV2>(deviceControl)->getParms();
- auto headers = std::dynamic_pointer_cast<DeviceGasV2>(deviceControl)->getHeaders();
- std::string url = std::dynamic_pointer_cast<DeviceGasV2>(deviceControl)->getUrl();
- if(url == "") return 1;
- if(auto res = cli.Get(url.c_str(), parms, headers)){
- if (res->status == 200) {
- DebugL << res->body << endl;
- return 0;
- }else {
- WarnL << res->body << endl;
- return -1;
- }
- }else{
- auto err = res.error();
- ErrorL << "HTTP Service unavailable:" << err << endl;
- return -1;
- }
- }
- }else if(deviceControl->getDeviceTool() == ContorlGear::DeviceTools::tcp){
- if(config::getPtr()->payServerIP_tcp == ""){
- ErrorL << "The device IP address is empty" << endl;
- return -1;
- }
- client->setDeviceControl(deviceControl);
- if(!client->alive()) client->startConnect(config::getPtr()->payServerIP_tcp, config::getPtr()->payServerPort_tcp);
- if(config::getPtr()->debug) DebugL << "Serial control data:" << bytesToHexString(data, length) << endl;
- auto buf = BufferRaw::create();
- buf->assign((char*)data, length);
- client->setSendBuf(buf);
- if(client->alive()) client->send(buf);
- }
- else return -1;
- }
- /**
- * @description: 串口数据接收
- * @param {*}
- * @return {*}
- */
- bool Expel::SerialReceive(CSerialPort& ser, std::shared_ptr<ContorlGear>& deviceControl){
- if(ser.isOpened()){
- Ticker ticker0;
- uint8_t buffer[1024];
- memset(buffer, 0, sizeof(buffer));
- config::Ptr m_config = config::getPtr();
- while (true)
- {
- if(ticker0.elapsedTime() >= 2000){
- WarnL << "deviceId[" << deviceControl->getDeviceId() << "] Control instruction timeout" << endl;
- break;
- }
- int len = ser.readAllData((char *)(buffer));
- if(len == 0) continue;
- int msg_id;
- if(deviceControl->Consumer(buffer, len, msg_id)){
- if(m_config->debug) DebugL << "deviceId[" << deviceControl->getDeviceId() << "] Device response is succeed" << endl;
- if(m_config->debug) DebugL << "REV:" << bytesToHexString(buffer, len) << endl;
- if(deviceControl->getStatusMsg(msg_id)){
- std::string json;
- SendDevice sendDevice;
- time_t timestamp;
- NettyClientResultMsg<SendDevice> nettyClientResultMsg;
- deviceControl->BuildDeviceInfo(sendDevice);
- time(×tamp);
- sendDevice.msgTime = ctime(×tamp);
- std::string requestId;
- requestId = uuid::generate();
- nettyClientResultMsg.setRequestId(requestId);
- nettyClientResultMsg.setDataType(NettyClientCommandEnum().device_info);
- nettyClientResultMsg.setData(sendDevice);
- nettyClientResultMsg.objectToJson(json);
- NoticeCenter::Instance().emitEvent(NOTICE_DEVICEINFO, requestId ,json);
- }
- break;
- }
- }
- }
- return true;
- }
- /**
- * @description: 全部打开
- * @param {*}
- * @return {*}
- */
- int32_t Expel::AllOpen(){
- if(!config::getPtr()->LowVersion){
- for (auto iter = m_deviceLists.begin(); iter != m_deviceLists.end(); iter++){
- this->Open(*iter);
- }
- }else{
- if(config::getPtr()->DeviceIds.empty()){
- return 0;
- }
- for(auto iter = config::getPtr()->DeviceIds.begin(); iter != config::getPtr()->DeviceIds.end(); iter++){
- ExpelDevice expelDevice;
- expelDevice.DeviceId = std::to_string(*iter);
- expelDevice.deviceType = (enum DeviceType)config::getPtr()->deviceType;
- this->Open(expelDevice);
- }
- }
- return 0;
- }
- /**
- * @description:
- * @param {*}
- * @return {*}
- */
- int32_t Expel::AllClose(){
- if(!config::getPtr()->LowVersion){
- for (auto iter = m_deviceLists.begin(); iter != m_deviceLists.end(); iter++){
- this->Close(*iter);
- }
- }else{
- if(config::getPtr()->DeviceIds.empty()) return 0;
- for(auto iter = config::getPtr()->DeviceIds.begin(); iter != config::getPtr()->DeviceIds.end(); iter++){
- ExpelDevice expelDevice;
- expelDevice.DeviceId = std::to_string(*iter);
- expelDevice.deviceType = (enum DeviceType)config::getPtr()->deviceType;
- this->Close(expelDevice);
- }
- }
- return 0;
- }
- /**
- * @description: 全部开炮
- * @param {*}
- * @return {*}
- */
- int32_t Expel::AllFire(){
- if(!config::getPtr()->LowVersion){
- for (auto iter = m_deviceLists.begin(); iter != m_deviceLists.end(); iter++){
- this->Fire(*iter);
- }
- }else{
- if(config::getPtr()->DeviceIds.empty()) return 0;
- for(auto iter = config::getPtr()->DeviceIds.begin(); iter != config::getPtr()->DeviceIds.end(); iter++){
- ExpelDevice expelDevice;
- expelDevice.DeviceId = std::to_string(*iter);
- expelDevice.deviceType = (enum DeviceType)config::getPtr()->deviceType;
- this->Fire(expelDevice);
- }
- }
- return 0;
- }
- /**
- * @description: 获取设备列表
- * @param {*}
- * @return {*}
- */
- int32_t Expel::UpdateDeviceList(vector<vector<std::string>>& datas){
- if(datas.empty()) {
- this->m_deviceLists.clear();
- return 0;
- }
- this->m_deviceLists.clear();
- for(auto &line: datas){
- ExpelDevice expelDevice;
- expelDevice.DeviceId = line[0];
- expelDevice.deviceType = (enum DeviceType)atoi(line[2].c_str());
- expelDevice.ServerIp = line[3];
- expelDevice.ServerCname = line[4];
- expelDevice.ServerCpwd = line[5];
- this->m_deviceLists.push_back(expelDevice);
- }
- return 0;
- }
- /**
- * @description: 获取驱鸟设备数量
- * @param {*}
- * @return {int32_t}
- */
- int32_t Expel::getExpelSize(){
- if(!config::getPtr()->LowVersion){
- return m_deviceLists.size();
- }else{
- return config::getPtr()->DeviceIds.size();
- }
- }
- /**
- * @description: getExpelInfo
- * @return {*}
- */
- std::string Expel::getExpelInfo(){
- std::string info;
- rapidjson::StringBuffer strBuf;
- rapidjson::Writer<rapidjson::StringBuffer> writer(strBuf);
- if(!config::getPtr()->LowVersion){
- writer.StartObject();
- writer.Key("Num");
- writer.Int(m_deviceLists.size());
- writer.Key("datas");
- writer.StartArray();
- for(auto iter = m_deviceLists.begin(); iter != m_deviceLists.end(); iter++){
- writer.StartObject();
- writer.Key("DeviceId");
- writer.String(iter->DeviceId.c_str());
- writer.Key("DeviceType");
- writer.Int(iter->deviceType);
- writer.Key("DeviceTools");
- writer.Int(iter->tool);
- writer.EndObject();
- }
- writer.EndArray();
- writer.EndObject();
- info = strBuf.GetString();
- }else{
- writer.StartObject();
- writer.Key("Num");
- writer.Int(config::getPtr()->DeviceIds.size());
- }
- return info;
- }
- } // namespace gsd
|