Tag: mqtt

使用Kitura在Swift中进行全栈编程

Swift成为了完全开放源代码(Apache 2.0许可)项目,并且走得更远,这使得Swift不仅可以在Darwin设备上运行,而且可以在Linux和其他平台(例如Android,raspberry-pi,大型机)上运行。 所有繁重的工作都是由Swift社区完成的,以使Swift可以在Linux和多个平台上使用,并且还在不断增长。 这意味着在大多数平台上都可以使用Foundation API,Swift语言,所有标准库以及用于并发的Dispatch。 现在大约有数十种可用的框架,包括IBM的Kitura,PerfectlySoft的Perfect,基于Swift语言的Q理论的Vapor。 为什么选择Swift? Swift是Java之类的高性能语言 Swift的内存使用率低 重用客户端代码,工作空间,工具和组件可以加快开发速度并提高生产率 IBM的Kitura Kitura是使用IBM开发的Swift语言编写的服务器端模块化框架。 Swift语言主要用于为Apple App Store创建基于iOS的应用程序。 开发人员必须为Java,Python,Ruby等后端编程选择不同的语言,基于Swift的客户端可以将其连接以进行CRUD操作。 Kitura使iOS开发人员更容易使用一种语言进行前端和后端编程,并创建完整的应用程序。 Kitura框架的重点 基于模块化和打包的Web框架 开箱即用,并利用Foundation API在macOS和Linux上创建应用程序。 Swift具有高性能,安全性和表现力,因此具有Kitura的特质。 轻松部署到IBM Bluemix和Watson集成等云平台,以创建Cognitive应用程序。 Xcode支持可实现更快,更轻松的开发 Yeoman生成器可在几分钟内创建和部署您的应用 全栈演示 使用ServerSide Kitura,IBM Watson和IoT平台控制由PI驱动的机器人 我们将为Raspberry PI驱动的机器人创建一个Remote,并使用服务器端Kitura作为中间件。 该机器人还将与Watson Text-To-Speech服务集成在一起。 遥控器将能够控制机器人的两件事: 输入文字让机器人说出来 选择一种颜色让机器人闪烁 建筑 遥控器使用swift构建并运行在iOS设备上。RobotRemote Control应用程序使用公开的REST API与基于Kitura的服务器进行通信。 该服务器具有CRUD API以及一个接受远程输入并将其发送到IBM IoT平台的API。 服务器上的API从远程应用程序接收JSON数据,并以MQTT消息的形式发布到IoT平台。 服务器使用Aphid MQTT客户端将消息发布到IBM IoT平台上的某个主题。 该机器人是使用raspberry-PI构建的。 LED和扬声器已连接到raspberry-PI。 PI运行一个nodejs应用程序,该应用程序正在侦听来自IoT平台的MQTT消息,该主题与基于Kitura的服务器发布消息的主题相同。 接收到MQTT消息后,将使用Watson开发人员云SDK将接收到的文本转换为语音,并将其通过管道传输到安装在raspberry-PI中的扬声器。 树莓派PI还运行Python代码,将正确的颜色信号发送到LED,使其闪烁。 创建远程机器人服务器 先决条件: […]

来自iOS中的MQTT的通知

如果您有一个应用程序正在监视一个来自MQTT代理的实时数据流,如我在先前的文章中所述,则您可能希望基于该实时数据流发送用户通知。 这可以在多种情况下工作,但就我而言,我有一个传感器,如果传感器检测到某个读数,则想警告用户。 为此,我遇到了两种可能性: 一种。 设置APNs(Apple推送通知服务)服务器,该服务器监视MQTT数据并在必要时向每个设备发送推送通知 要么 b。 直接从客户端设备读取MQTT数据,并在必要时发送本地通知 在我的情况下, 选项B更具吸引力,因为它消除了中间人 (APN),这意味着您不必设置服务器即可执行该任务。 选项B不仅更容易,而且还节省了大量的时间和运行APN的设备资源。 但是,您应该注意,有些付费服务可以为您处理APN。 如果您的项目规模较大且预算较大,则可能需要进一步研究该选项。 为了建立这个MQTT后台通知系统,我们需要弄清楚一些事情: 设置背景提取 在后台获取过程中获取mqtt数据 必要时发送通知 它是什么 在iOS中,后台抓取是指将应用从后台唤醒以执行简短的任务,这通常涉及检查服务器上是否有要下载的新信息。 这很有用,这样用户回去打开应用程序时就可以为他们准备好新信息,而不必等待其加载。 如果您愿意,可以在这里阅读更多有关后台获取和其他后台模式的信息。 如何设定 为了在您的应用程序中实现后台提取,您必须将您的应用程序标记为具有该功能。 为此,请选择应用程序目标 ,然后在顶部选择“ Capabilities ”。 从那里打开背景模式开关,并选中背景提取框,如下所示: 现在,您必须告诉应用程序您要多久运行一次后台获取。 为此,将以下内容添加到application(didFinishLaunchingWithOptions:)方法中: //尽可能频繁地运行后台抓取 UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum) 开发人员可以根据具体情况决定此频率,但就我而言,我绝对希望尽可能频繁地获取数据。 现在,您可以在AppDelegate中添加一个方法,该方法将在每次后台获取时调用。 它看起来应该像这样: func应用程序(_应用程序:UIApplication,performFetchWithCompletionHandler completeHandler:@转义(UIBackgroundFetchResult)->无效){completionHandler(UIBackgroundFetchResult.newData) } 当然,我们稍后会添加到该方法,但是正如您已经看到的那样,该方法必须在完成时调用完成处理程序 。 完成处理程序报告是否找到了新数据,系统将使用它来确定运行应用程序的后台获取的最佳时间以及应多久运行一次。 因此,至关重要的是准确地报告该信息,而不是像上述方法那样盲目地说有新数据。 该操作只是作为占位符完成的,稍后我们将修复该问题。 现在,我们要在后台获取期间接收我们的MQTT数据。 设置MQTT可以是其自己的一个微型项目,因此,如果尚未设置MQTT,则应阅读此文章。 当然,在这种情况下,我们将需要做一些更改以使MQTT有用。 我们将需要从后台模式创建一个连接,并使AppDelegate成为MQTT连接的委托。 我们可以使用与上述文章到AppDelegate相同的方法来建立连接: func setUpMQTT(){ 让clientID =“ CocoaMQTT-” +字符串(ProcessInfo()。processIdentifier) […]

iOS中的MQTT

为什么和如何 什么是MQTT? MQTT是一种轻量级协议,用于将消息从设备传输到客户端。 作为对MQTT的非常简短的描述,它通过具有充当中间人的MQTT代理来操作。 该代理管理一个或多个主题,这些主题是消息可能涉及的主题。 设备可以从那里将消息发布到某个主题,并且订阅该主题的所有连接的客户端都将收到该消息。 如果您以前从未使用过MQTT,则仅靠简要概述可能还不够,您可以在此处找到更详细的MQTT描述。 MQTT的用途 MQTT之所以出色,是因为它允许设备以相对较低的开销成本将数据发布到客户端,从而使其成为物联网设备的首选协议。 结果,您可能会发现自己想要在智能手机应用程序中实现MQTT,以允许移动访问此类IOT设备的数据。 当然,这可以应用于多种情况,但是在我的特殊情况下,我有一个传感器每秒大约发布一次读数。 我的目标是在我正在构建的应用程序中显示这些实时读数,因此本文将基于该特定应用程序,但当然仍可以应用于涉及iOS中MQTT的各种应用程序。 当然,它不仅可以显示原始消息,还可以进一步发展,并且您可以决定创建一个包含文本和图像的更加精致的界面,以更吸引人的方式解释和显示传入的MQTT消息。 您也可以根据需要决定使用实时MQTT数据发送通知,这将在以后的文章中进行介绍。 幸运的是,将MQTT数据的实时流传输到iOS应用程序上非常简单。 MQTT库 您将需要一个库才能将MQTT与iOS应用程序一起使用,因此我建议使用CocoaMQTT。 CocoaMQTT是“ pod”,这意味着它是使用CocoaPods进行管理和安装的。 通过第一个链接,您将找到设置和使用说明,但是在这里,我将显示必要的部分以使其变得更容易。 要使用CocoaMQTT,您将需要使用CocoaPods设置项目。 要做到这一点: 打开终端 cd进入项目的根文件夹 运行“ pod init” 这将创建一个名为“ Podfile”的文件。从此处开始,您需要编辑该“ podfile”以包含CocoaMQTT。 为此,请在您选择的编辑器中打开文件并添加以下内容: 豆荚’CocoaMQTT’ Podfile现在应如下所示: #取消注释下一行以定义项目的全局平台 #platform:ios,’9.0′ 目标’MQTTExample’做 #如果您不使用Swift并且不想使用动态框架,请注释下一行 use_frameworks! #MQTT的豆荚示例 豆荚’CocoaMQTT’ 结束 当然,目标名称可能会有所不同,具体取决于您为项目命名的名称。 从那里开始运行pod install ,CocoaPods将安装CocoaMQTT。 CocoaPods还将创建一个新文件“ MQTTExample.xcworkspace”,您现在必须使用它来代替xcodeproj文件。 打开该工作区,是时候添加CocoaMQTT了。 设置 要设置基本应用程序,只需在主故事板的中央放置一个标签,然后在视图控制器中创建一个插座即可。 到目前为止,您应该具有以下内容: 您可以在以后使界面更加精美,但这现在就可以了。 实施MQTT 现在,我们需要设置ViewController来建立MQTT连接并处理所有接收到的消息。 在此应用程序中,目标是在主视图的标签中显示任何收到的消息。 […]

从线程中的C函数更新UI

我正在iPhone应用程序中使用名为libmosquitto的库。 该库是用C语言编写的。它接收推送通知,因此在一个线程中运行。 我想把它接收到的数据,并显示在一个UITableView,但是(我认为)我必须编写libmosquitto作为C函数,而不是Objective C方法使用的callback,所以我不能访问“自我”为了做:[self performSelectorOnMainThread:@selector(hideActivityViewer)withObject:nil waitUntilDone:NO]; 任何人都有这样的问题,有另一种方式我可以更新用户界面? 从我的一个Objective C方法中,我称之为: mosquitto_message_callback_set(mosq, my_message_callback); 而my_message_callback被定义为: void my_message_callback(void *obj, struct mosquitto_message *message) { NSLog(@"Do this thing:"); if(message->payloadlen){ const char *payload = (const char *)message->payload; [array addObject:[NSString stringWithUTF8String: payload]]; //[self performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:NO]; //printf("%s %s\n", message->topic, message->payload); }else{ //printf("%s (null)\n", message->topic); } //fflush(stdout); } 谢谢

针对iOS推送通知的MQTT服务

在Android上GCM的低可靠性是我已经转移到另一个服务来处理推送消息:Pushy,( https://pushy.me/ ) 该服务依赖于MQTT,根据我的经验以及许多其他评论,实时特征集名称很less,而且很less会丢失一条消息。 然而,联系支持,他们指出,没有iOS集成,只支持Android。 我已经广泛search,但还没有find一个合适的替代支持MQTT开箱即用的iOS。 有没有这样的服务可以让更可靠的推送消息?

在Swift 3中使用Moscapsule的Mqtt客户端

上个月,我试图在我的一个应用程序中第一次使用Mqtt。 作为一个初学者,我很难find如何以及在哪里放样本代码,我发现在各种来源。 在我的问题上花了一个星期后,我设法让mqtt在我的项目中工作,所以我在这里分享我所学到的步骤。 这不是一个真正的问题(xD!) 首先,请给予Moscapsule的开发者信用。 你可以在他们的github页面上find更多的信息和细节。 好的,让我们开始展示吧。 如何在iOS上使用Moscapsule实现mqtt客户端(Swift)? 1)使用吊舱安装Moscapsule( 再次检查这里 )。 2)在你的viewcontroller文件(或任何你使用xxxx.swift的名字): a) import Moscapusle b)在viewDidLoad()方法之前,configuration并创buildmqtt客户端(使其成为全局variables)。 //set MQTT client configuration let mqttConfig = MQTTConfig(clientId: "iOS_test_mqtt", host: "yourserver.adress.com", port: 1883, keepAlive: 60) // create new MQTT Connection var mqttClient: MQTTClient? = nil 3)在viewDidLoad()或其他你需要的方法中,请实现onPublish方法和onMessageCallback方法。 mqttConfig.onPublishCallback = { messageId in print("published (msg id=\(messageId)))") } mqttConfig.onMessageCallback = { mqttMessage […]