Lumen Taba成为生产力手表:我们为智能灯泡编写自己的应用程序

图片大家好,我一直对“智能”家庭感兴趣,尤其是对一些简易设备进行编程。上次我在路由器上使用GPIO安装了OpenWrt并通过电话通过GPIO打开了前门(现在是布局)。这次是关于生产力,而不是安全。

许多人已经听说过“智能”灯泡,它们可以改变颜色,甚至闪烁音乐。不久前,我手里拿着一个。这是LuMini。我们中哪位程序员只对“智能”设备感兴趣,因此我们无法为其创建自己的应用程序,但是有很多想法。

事实证明,LuMini适合我们。打开iOS的本机应用程序后,我立即意识到可以使用灯泡。灯泡以一种神奇的方式连接,连接之后,我开始对Android应用程序进行逆向工程。我在某个地方听说过,它们可以完美地反编译为Java文件,并且从那里您已经可以掌握使用灯的所有逻辑。获得apk并不困难。这里可以发现从谷歌播放APK应用程序,但没有被反编译成的代码。同时,我已经将这个想法告诉了我的同事并听到了积极的评价。因此,当我反编译时,她在Node.js上找到了一个服务器,该服务器连接到灯并提供“句柄”进行控制。我想了决定,为什么不呢。因此,现在我可以自己控制灯了-完成一半的工作。

图片图片

之后,您必须选择一个想法。
1.将灯泡放在显示器后面,并在屏幕上的图像下方打开它的颜色。我看过几部这样的电视。
2.根据天气情况,在早晨打开灯泡的颜色。
3.根据屏幕的亮度调整灯光的亮度(例如,夜间亮度不高)。原来是没用的。
4.例如,当您在操作过程中与模因接触时,将灯泡放在显示器后面并打开红灯。

第四个想法似乎最有用。我们已经是团队中的两个了,我们赶紧去做。我在Swift'e上为静止OS X编写了该应用程序,一位同事清理了北部的多余部分。关于服务器,我什么也不会写,所有有趣的事情都可以在这里看到

我之所以选择OS X和Swift,是因为我或多或少地了解第二个,但是对于第一个,我花了很长时间摸索写东西,希望它能奏效。因此,应用程序应跟踪“不良”位置,并在油漆中放一个灯泡:打开红灯。语言没有内置这样的功能(很好)。好吧,我去壁橱问谷歌

图片

-我想知道使用Swift或至少使用Objective-C在浏览器中打开的标签页。
-我认为您不需要它,这里是AppleScript。
-好酷,那是什么?
-内置脚本可以控制系统,通常将其用于自动化。
-好的,然后告诉我如何在Safari中找到打开的标签页。
-是的,在这里(链接还有其他浏览器。
-好的,谢谢。

稍微更改脚本。

tell application "System Events" to set frontApp to name of first process whose frontmost is true

if (frontApp = "Safari") then
    using terms from application "Safari"
        tell application frontApp to set currentTabUrl to URL of front document
        tell application frontApp to set currentTabTitle to name of front document
    end using terms from
else if (frontApp = "Google Chrome") then
    using terms from application "Google Chrome"
        tell application frontApp to set currentTabUrl to URL of active tab of front window
        tell application frontApp to set currentTabTitle to title of active tab of front window
    end using terms from
else if (frontApp = "Lumen Taba") then
    return 1
else
    return
end if

return currentTabUrl


现在仍然可以在background'e中运行此程序,而该程序位于帽子中。

//run tracker in background mode
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    while !self.needStop {
        self.isRunning = true
        var error: NSDictionary?
        
        //run script
        if let scriptObject = NSAppleScript(source: self.scriptText!) {
            if let output: NSAppleEventDescriptor = scriptObject.executeAndReturnError(
                &error) {
                //if browser is active
                if output.stringValue != nil {
                    
                    //this app is active
                    if (output.int32Value == 1) {
                        continue
                    }
                    
                    //if bad url
                    if self.urlValidator.isUrlStringBanned(output.stringValue!) {
                        
                        //bad url isn't changed
                        if self.lastBadUrl == output.stringValue {
                            continue
                        }
                        
                        self.lastBadUrl = output.stringValue
                        NSNotificationCenter.defaultCenter().postNotificationName("BadUrlIsOpened",
                            object: self.lastBadUrl)
                        continue
                    }
                    
                }
                
                
                //the browser is not active
                //turn off lamp if it was on
                if self.lastBadUrl != nil {
                    self.lastBadUrl = nil
                    NSNotificationCenter.defaultCenter().postNotificationName("BadUrlIsClosed", object: nil)
                }

            } else if (error != nil) {
                print("error")
            }
        }
        sleep(self.CHECK_INTERVAL)
    }
    
    self.isRunning = false
})
图片
这就是在Swift中完成的方式。

现在,我们测试url的损坏情况。选择使用正则表达式作为停止列表。仅一个域就足够了,该站点的所有页面都将被阻止。当然,在另一个站点可能包含一个禁止域的情况下,这是可能的,并且情况略有不同,但是在这种情况下,您很可能在做错事情(为什么要在Google上搜索vk.com)。将网站添加到设置中并保存到应用程序中嵌入的文件中,代码中的验证本身如下所示:

private func checkUrl(url: NSURL) -> Bool {
    let domain = url.host
    
    //there is no domain
    if (domain == nil) {
        return false
    }
    
    let badRegexes = getBadRegexes()
    for br in badRegexes {
        if matchesForRegexInText(br, text: url.absoluteString) {
            return true
        }
    }
    
    return false
}

private func matchesForRegexInText(regex: String!, text: String!) -> Bool {
    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = text as NSString
        let results = regex.matchesInString(text,
                                            options: [],
                                            range: NSMakeRange(0, nsString.length))
        return results.count > 0 ? true : false
        
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        return false
    }
}


您可以在存储库中看到所有代码,但现在我将显示最终结果。

图片
图片



我期待评论和新想法,使用类似的灯泡有多酷。

另外,如果您对文章感兴趣并希望拥有这样的员工,那么我的简历适合您:goo.gl/ppnr6z

从本文发布之日起14天内,您可以使用 GEEKT-UL 代码以10%的折扣购买Lumen智能灯泡

Source: https://habr.com/ru/post/zh-CN396195/


All Articles